mysql 外键约束(转载)
【附:MYSQL中文指南 http://c.biancheng.net/view/2441.html】
原文链接:https://www.cnblogs.com/whylinux/p/9905134.html
1.什么是外键
A表的主键,在B表中字段出现,就是外键。
2.什么是约束:约束是一种限制,它通过对表的行货列的数据做出限制,来确保表的数据的完整性、唯一性。比如人员表中有一列是部门id,当新增一个人员的时候,我们不需要手动的在部门id字段给这个人员设置一个部门,而是新增则个新人员记录的时候默认就会有一个部门id给了这个人员,这就是约束。
3.以上1和2结合一起就是外键约束。即:foreign key
4.具体操作
4.1创建表时,同时创建外键约束

4.2已创建表后,追加外键约束

(1)添加外键方法
-- CONSTRAINT 就是创建外键约束 fk_id是外键约束的名字-- foreign key (dept_id) references dept(did)意思是设置person表中的dept_id字段和dept表中的did字段关联,dept表中的did字段就是person表中的dept_id的外键约束,这个外键约束的名字叫做fk_id,一般潜规则外键约束的名字开头是fk_altertablepersonaddCONSTRAINTfk_idforeignkey(dept_id)REFERENCESdept(did);
此时可以发现在person表中的,点击外键按钮,可以看到创建出来的外键

栏位表示的是person表中的dept_id字段,参考栏位的did就是person表中的dept_id字段的约束,dept_id字段的值被约束为dept字段did字段的值

主表就是外键约束有约束值的那个表
从表就是被约束的那个表

(2)外键约束的4种类型,RESTRICT、NO ACTION、CASCADE、SET NULL主要针对于外键里的删除时和更新时

RESTRICT(约束):如果出现在删除时,意思是约束外键主键did记录(主表中的记录)不能直接删除,必须先删除被约束的表(从表)字段中dept_id所有这个外键主键值对应的记录,才能删除外键约束(主表中的记录)
NO ACTION:
CASCADE:删除选择这个时,删除主表中的记录时,主表中的这个主键id关联的从表的这个id值所在的记录也会被删除。建议不选。
SET NULL :删除选择这个时,如果从表(被约束的字段所在的表中)被约束的字段的值设置为可以为空时,那么当删除主表的记录时,主表中被删除的这个记录对应的主键值(约束从表字段的那个值)在从表中对应的字段中出现的那个记录的被约束字段的值就会变为NULL。
最常用的是选择RESTRICT不让删的这个约束、或者选择SET NULL删除后值表为空。
目前公司都不太喜欢使用这种真实的外键约束,而是使用虚拟的外键约束。虚拟外键约束:就是人员表中的部门id字段中的id值是部门表中的主键id的值,这就是虚拟外键约束,也是目前来说比较流行使用的。
(3)删除外键
-- 删除外键约束altertablepersonDROPforeignkeyfk_id;
5.其他约束类型


-- 向t5表中插入两条记录,第二值用的都是默认值,如果是默认值则可以不填或填defaultinsertintot5values(3,DEFAULT), (4,DEFAULT);