外键在数据库中其实是很常见的,像大家常见到的一对一、一对多、多对多表关系,这就是“外键+索引”实现的,也可以叫外键约束。个人怎么理解都无所谓?也不用太追究字面上的意思,重要的是你能在实际工作中灵活运用起来就行了。
由于PhpMyadmin没有图形界面“外键约束”操作功能,只好用了 Navicat 15 for MySQL,当我添加外键的时候,发现有外键设置的时候,有几个值,如下:
- Cascade
- NO ACTION
- Restrict
- SET NULL
每个设置的值肯定是有不同的含义的,下面给大家简单讲解一下:
1、 cascade
在父表上update/delete记录时,同步update/delete掉子表的匹配记录。
2、No action
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作。
3、Restrict
同no action一样, 都是立即检查外键约束。
4、SET NULL
在父表上update/delete记录时,将子表上匹配记录的列设为null。
这里要注意子表的外键列不能为not null。
5、Set default
父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别。
Cascade、NO ACTION、Restrict、SET NULL之间的区别
1、CASCADE:级联
(1)所谓的级联删除,就是删除主键表的同时,外键表同时删除。
(2)我举一个例子:以读大学为例子,这里有2张表:学生表和院系表,假如院系表中的某个院系被删除了,那么在学生表中要想查询这个被删除的院系号所对应的院信息就会报错,因为已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。当然反过来讲,你删除学生表中的记录,并不影响院系表中的数据,你查询院系号也能正确查询。所以删除外键表中的数据并不影响主键表。
2、NO ACTION(非活动,默认)、RESTRICT:约束/限制
当取值为No Action或者Restrict时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。(即外键表约束主键表)
NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。
3、SET NULL
当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null,(一样是外键表约束主键表,不过这就要求该外键允许取null)。