1.7.2.3外键差异
外键的MySQL实现与以下关键方面的SQL标准不同:
如果父表中有几行具有相同的引用键值,则会
InnoDB
在外键检查中进行操作,就好像其他具有相同键值的父行不存在。例如,如果您定义了一个RESTRICT
类型约束,并且有一个具有多个父行的子行,InnoDB
则不允许删除任何这些父行。InnoDB
基于对应于外键约束的索引中的记录,通过深度优先算法执行级联操作。一个
FOREIGN KEY
引用了非约束UNIQUE
关键不是标准的SQL,而是一个InnoDB
扩展。如果
ON UPDATE CASCADE
或ON UPDATE SET NULL
递归更新同一个表,它以前在同一级联更新,它的行为就像RESTRICT
。这意味着您不能使用自引用ON UPDATE CASCADE
或ON UPDATE SET NULL
操作。这是为了防止级联更新产生的无限循环。自引用的ON DELETE SET NULL
,在另一方面,是可能的,因为是自引用ON DELETE CASCADE
。级联操作可能不会嵌套在15级以上。在插入,删除或更新许多行的SQL语句中,外键约束(如唯一约束)被逐行检查。执行外键检查时,
InnoDB
必须对必须检查的子记录或父记录设置共享的行级锁。MySQL立即检查外键约束;支票不会推迟到交易提交。根据SQL标准,默认行为应该是延迟检查。也就是说,只有在处理完整个SQL语句之后才会检查约束。这意味着不可能使用外键删除引用自身的行。
有关InnoDB
存储引擎如何处理外键的信息,请参见第14.8.7节“InnoDB和FOREIGN KEY约束”。