三个条件:
- 两个表的存储引擎必须是InnoDB
- 索引型
- 数据类型相同
如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。
如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。
设置InnoDB的动作,默认为RESTRICT: 拒绝删除或者更新父表。
外键约束的两种情况
-
父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;外键定义为ON UPDATE CASCADE ON DELETE RESTRICT
-
父表更新时子表也更新,父表删除时子表匹配的项也删除。外键定义为ON UPDATE CASCADE ON DELETE CASCADE
on delete和on update都有下面四种动作。
cascade:主表删除或更新相应的数据行,则子表同时删除或更新与主表相匹配的行,即级联删除、更新。
set null:主表删除或更新相应的数据行,则子表同时将与主表相匹配的行的外键列置为null。当外键列被设置为not null时无效。
no action:数据库拒绝删除或更新主表。
restrict:数据库拒绝删除或更新主表。如果未指定on delete或on update的动作,则on delete或on update的默认动作就为restrict。