1.7.2.3外键差异

外键的MySQL实现与以下关键方面的SQL标准不同:

  • 如果父表中有几行具有相同的引用键值,则会InnoDB在外键检查中进行操作,就好像其他具有相同键值的父行不存在。例如,如果您定义了一个RESTRICT类型约束,并且有一个具有多个父行的子行,InnoDB则不允许删除任何这些父行。

    InnoDB基于对应于外键约束的索引中的记录,通过深度优先算法执行级联操作。

  • 一个FOREIGN KEY引用了非约束UNIQUE关键不是标准的SQL,而是一个InnoDB扩展。

  • 如果ON UPDATE CASCADEON UPDATE SET NULL递归更新同一个表,它以前在同一级联更新,它的行为就像RESTRICT。这意味着您不能使用自引用ON UPDATE CASCADEON UPDATE SET NULL操作。这是为了防止级联更新产生的无限循环。自引用的ON DELETE SET NULL,在另一方面,是可能的,因为是自引用ON DELETE CASCADE。级联操作可能不会嵌套在15级以上。

  • 在插入,删除或更新许多行的SQL语句中,外键约束(如唯一约束)被逐行检查。执行外键检查时,InnoDB必须对必须检查的子记录或父记录设置共享的行级锁。MySQL立即检查外键约束;支票不会推迟到交易提交。根据SQL标准,默认行为应该是延迟检查。也就是说,只有在处理完整个SQL语句之后才会检查约束。这意味着不可能使用外键删除引用自身的行。

有关InnoDB存储引擎如何处理外键的信息,请参见第14.8.7节“InnoDB和FOREIGN KEY约束”

results matching ""

    No results matching ""