• 1.7.2.3外键约束差异


     

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

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

    • 如果ON UPDATE CASCADEON 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识别或强制执行MATCH引用完整性约束定义中使用子句。使用显式MATCH子句不会产生指定的效果,并且会导致ON DELETEON UPDATE子句被忽略。MATCH 应避免指定

      MATCHSQL标准中 的子句控制NULL与引用表中的主键进行比较时如何处理复合(多列)外键中的值。MySQL本质上实现了定义的语义MATCH SIMPLE,该语义 允许外键全部或部分NULL在这种情况下,即使插入的(子表)行与引用的(父)表中的任何行都不匹配,也可以将其插入。(可以使用触发器来实现其他语义。)

    • MySQL出于性能原因要求对引用的列进行索引。但是,MySQL没有强制要求UNIQUE必须声明或声明所引用的列 NOT NULL

      一个FOREIGN KEY引用了非约束UNIQUE关键不是标准的SQL,而是一个 InnoDB扩展。的 NDB存储引擎,在另一方面,要求在作为外键引用的任何列的显式唯一密钥(或主键)。

      NULL对于诸如UPDATE或的操作,未很好地定义对 非唯一键或包含值的 键的外键引用的处理DELETE CASCADE建议您使用仅引用UNIQUE(包括 PRIMARY)和NOT NULL键的外键。

    • MySQL解析但忽略“ 内联 REFERENCES规范 ”(在SQL标准中定义),其中引用被定义为列规范的一部分。MySQL REFERENCES仅在作为单独FOREIGN KEY 规范的一部分指定时才接受 子句对于不支持外键的存储引擎(例如 MyISAM),MySQL Server会解析并忽略外键规范。

    有关外键约束的信息,请参见 第13.1.20.5节“外键约束”

  • 相关阅读:
    字段名删不掉
    刷新f5/ctrl+f5
    大量数据模拟
    sub_query join drupal7 view_query_alter
    测试风格的代码
    csv/excel乱码
    window.location.reload(true)的异步现象
    扫描条形码
    yield %%% generator
    batch example
  • 原文地址:https://www.cnblogs.com/owlin/p/13729185.html
Copyright © 2020-2023  润新知