外键的使用需要满足下列的条件:
- 两张表必须都是InnoDB表,并且它们没有临时表。
- 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。
- 建立外键关系的对应列必须建立了索引。
- 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。
如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:
1.CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
2.SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;
3.RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
4.NO ACTION:同 RESTRICT,也是首先先检查外键;
外键约束使用最多的两种情况无外乎:
1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;
2)父表更新时子表也更新,父表删除时子表匹配的项也删除。
前一种情况,在外键定义中,我们使用
ON UPDATE CASCADE ;
ON DELETE RESTRICT;
后一种情况,可以使用
ON UPDATE CASCADE;
ON DELETE CASCADE。