文章目录
- 数据库约束
- 1.约束类型
- 1.1 not null
- 1.2 unique 唯一约束
- 1.3 主键约束 primary key
- 1.4 default 默认值
- 1.5 外键约束 foreign key
数据库约束
约束就是让数据库帮助程序猿更好的检查数据是否正确。
1.约束类型
- not null - 提示某列不能存储 NULL 值。
允许为空,选填项;不允许为空,必填项。 - unique - 保证某列的每行必须有唯一的值。
表里存的数据不能有重复的值。 - default - 规定没有给列赋值时的默认值。
- primary key - not null 和 unique 的结合,确保某列(或两个列多个列的结合)有唯一表示有助于更容易更快速地找到表中一个特定的记录。
每条记录的身份标识。 - foreign key - 保证一个表中数据匹配另一个表中的值的参照量整性。
多个表中的关联关系,要求某个记录必须在另一个表中存在。
1.1 not null
先创建一个表
NULL 这一列描述了是否允许是空。
当加上了 not null 之后,NULL 这一列就变成不允许为 NULL。
name 这一列未被指定,所以是 YES。
可以发现往 id 这一列插入 null 记录时,就报错了。
1.2 unique 唯一约束
创建一个表
UNI 就是 unique 的简写。
再次插入 id 为1的记录是就报错了,而插入新的 id 记录时就不会报错了。
数据库是先查找这一条记录是否有相同的,若没有才会插入。
一个列可以可以同时加上多个约束。
例如加上 not null 和 unique :
PRI 就是 接下来要介绍的 primary key 的简写。
1.3 主键约束 primary key
可以根据报错信息得出被 primary key 约束的 id 列既不能是 NULL 的,也不能是重复的记录。
因为主键和 unique 都有先查询的过程,mysql 就会默认给 primary key 和 unique 这样的列自动添加索引(后面会讲),来提高查询的速度 。
注意:
- 实际开发中大部分的表一般都会带有一个主键,主键往往是一个整数表的 id 。
- 在 mysql 中,一个表里只能有一个主键。
- 虽然主键不能有多个,但是mysql允许把多个列放到一起共同作为一个主键。
- 主键另外一个常用方法是使用 mysql 自带的自增主键作为主键的值。
圈出的部分表示插入 id 的时候可以手动指定,也可以不手动指定(null),mysql 会自动生成。
这个操作不是说设成null值,而是交给数据库设成自增主键。
演示:
id 会一直按照最大值下后排列。
也可以手动指定!!!
演示:
在下一条数据插入一个101。
每次插入数据的时候,mysql 就会自动找到上一条记录的 id ,在这个基础之上,进行自增。
如果先是采用自增插入之后,再采用手动插入,之后再采用自增插入会从6开始还是会从102开始?
演示:
可以发现是接着上一条记录的 id ,是按照之前的最大值来往后累加的!!!
1.4 default 默认值
插入记录的时候如果有具体的数据,则以插入的为准。
如果没有,就以设置的默认值为准
1.5 外键约束 foreign key
可以查看学生是在哪个班级,看学生是否存在。
学生表和班级表两个表相互约束就称为外加约束。
没有100班级,也就是非法的数据。
可以简单理解为不是本班的学生。
为了让mysql帮助程序猿完成上述的的检查动作,就引入了外键约束!!!
此时外键约束的含义就是要求 student 表里的务必要在 class 表里的 id 列中存在的。
\
可以看到第一条记录,因为calss表中 1 是存在的,因此插入成功。
但是 101 是不存在的,因此插入失败,此时就不能随便的插入了。
学生表中的数据,要依赖班级表的数据,班级表的数据要对学生表产生约束力。
就像是父亲对孩子的约束力。
此处起到约束作用的班级表就叫做“父表”(parent);被约束的表就叫做“字表”(child)。
子表也可以反过来约束父表。
无论是添加还是修改,只要子表里的记录没在父表中存在,都会产生同样的报错信息。
如果要想删除,只能先删除子表,再删除父表。
要想创建外键,就要求父表的对应的列,得有 primary key 或者 unique 约束!!!
此时没有primary key 或者 unique 进行约束,所以就报错了。
现在考虑一个场景:电商
有一个商品表,商品表里有很多商品。
还有一个订单表,订单里有商品id这一列。
商品表:
goods(id, name , unitprice);
存在商品编号、商品名称、商品价格。
例如:
商品编号:1、商品名称:衣服 、商品价格: 100
商品编号:2、商品名称:鞋子 、商品价格: 200
订单表:
order(orderid, goodsid, time);
存在订单id、商品id、订单生成时间。
例如:
订单id: 1、商品id: 1、订单生成时间: 2022-11-10
订单id: 2、商品id: 2、订单生成时间: 2022-11-12
订单中的商品id必须要在商品表中存在。
现在这个衣服订单太多了,要将这个商品下架。
需要怎么做?
解决思路:
要想对商品下架并不是删除记录了。
而是把“是否下架”这个属性设置成是。
这种方法叫逻辑删除,并不是真正的删除。
逻辑删除引发的问题:
解决办法:
由于硬盘空间是不值钱的,因此充钱可以解锁海量的硬盘空间!!!