关键词:外键 | 索引 | InNoDB和MyISAM | 引用 | Mysql
设置外键的目的:保证数据的一致性!
一、外键的使用条件:
① 两个表必须是InnoDB表,MyISAM表暂时不支持外键
#查看表类型SHOW TABLE STATUS#查询结果的Engine字段下,一般默认InnoDB类型
② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
#创建索引CREATE INDEX 字段1 ON test(字段1) #对test2创建test的索引,在test2下执行,test2为从,test为主
这一步也是博主自己刚开始研究是碰到的最大的坑,
外键引用一直选不了对应字段,可能是你没有设置索引
③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
二、设置外键
1、SQL代码设置
ALTER TABLE test2
ADD xxx #约束名 自己起
FOREIGN KEY test(字段2) #外键
REFERENCES test2(字段2) #约束表字段
ON DELETE CASCADE #父表删除子表更新方式
ON UPDATE CASCADE; #父表更新子表更新方式
2、可视化界面设置
选中表—》关/系/外键 | F10 ——》外部键
约束名自动生成不用管,重点是后面的更新和删除关键字
三、相关关键字含义
外键约束(表2)对父表(表1)的含义:
在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句。
关键字 | 含义 |
---|---|
CASCADE | 删除包含与已删除键值有参照关系的所有记录 |
SET NULL | 修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段) |
RESTRICT | 拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置) |
NO ACTION | 啥也不做 |
四、外键约束使用最多的两种情况:
场景 | 关键字选择 |
---|---|
①父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败; | ON UPDATE CASCADE ON DELETE RESTRICT; |
②父表更新时子表也更新,父表删除时子表匹配的项也删除。 | ON UPDATE CASCADE ON DELETE CASCADE; |
更多知识链接:
1、外键详解知识点:
https://www.cnblogs.com/microtiger/p/7814177.html
2、两表关联更新操作:
https://blog.csdn.net/qq_35866846/article/details/102798941