约束就是让数据库帮助程序猿更好的检查数据是否正确。
先创建一个表
NULL 这一列描述了是否允许是空。
当加上了 not null 之后,NULL 这一列就变成不允许为 NULL。
name 这一列未被指定,所以是 YES。
创建一个表
再次插入 id 为1的记录是就报错了,而插入新的 id 记录时就不会报错了。
数据库是先查找这一条记录是否有相同的,若没有才会插入。
一个列可以可以同时加上多个约束。
例如加上 not null 和 unique :
PRI 就是 接下来要介绍的 primary key 的简写。
可以根据报错信息得出被 primary key 约束的 id 列既不能是 NULL 的,也不能是重复的记录。
因为主键和 unique 都有先查询的过程,mysql 就会默认给 primary key 和 unique 这样的列自动添加索引(后面会讲),来提高查询的速度 。
注意:
圈出的部分表示插入 id 的时候可以手动指定,也可以不手动指定(null),mysql 会自动生成。
这个操作不是说设成null值,而是交给数据库设成自增主键。
演示:
也可以手动指定!!!
演示:
每次插入数据的时候,mysql 就会自动找到上一条记录的 id ,在这个基础之上,进行自增。
如果先是采用自增插入之后,再采用手动插入,之后再采用自增插入会从6开始还是会从102开始?
演示:
可以发现是接着上一条记录的 id ,是按照之前的最大值来往后累加的!!!
可以查看学生是在哪个班级,看学生是否存在。
学生表和班级表两个表相互约束就称为外加约束。
没有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必须要在商品表中存在。
现在这个衣服订单太多了,要将这个商品下架。
需要怎么做?
解决思路:
要想对商品下架并不是删除记录了。
而是把“是否下架”这个属性设置成是。
这种方法叫逻辑删除,并不是真正的删除。
逻辑删除引发的问题:
由于硬盘空间是不值钱的,因此充钱可以解锁海量的硬盘空间!!!