【问题标题】:In MySQL, can I defer referential integrity checks until commit在 MySQL 中,我可以将参照完整性检查推迟到提交之前吗
【发布时间】:2011-02-16 09:32:23
【问题描述】:

this question 一样,我一直在阅读 PoEAA,想知道是否可以将引用完整性检查推迟到 MySQL 中的提交。

我想在同一个提交中插入一堆产品和相关产品时遇到了这个问题。即使在事务中,当我尝试插入 related_products 连接表时也会遇到约束错误。

如果有帮助,我将使用 PHP PDO 进行数据库连接。

如果您能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: mysql referential-integrity


    【解决方案1】:

    看来我的答案是here...

    与一般的 MySQL 一样,在插入、删除或更新许多行的 SQL 语句中,InnoDB 逐行检查 UNIQUE 和 FOREIGN KEY 约束。在执行外键检查时,InnoDB 在它必须查看的子记录或父记录上设置共享行级锁。 InnoDB 立即检查外键约束;检查不会延迟到事务提交。 根据 SQL 标准,默认行为应该是延迟检查。也就是说,仅在处理完整个 SQL 语句后才检查约束。在 InnoDB 实现延迟约束检查之前,有些事情是不可能的,例如删除使用外键引用自身的记录。

    回到绘图板。

    【讨论】:

    • @rossmcf +1 因为我一直在搜索这句话的文档:D
    • 如果这对您来说是一个重要功能,您可以考虑迁移到支持延迟约束(包括自 9.0 以来的延迟唯一约束)的 PostgreSQL - 您还会获得许多其他漂亮的功能(递归查询,窗口函数,检查约束,...)
    • 自 2004 年以来一直存在对此的功能请求:bugs.mysql.com/bug.php?id=7529 现在任何一天...
    • 语言似乎已移至point 3 here
    • @jswolf19 如果我没记错的话,这就是他在回答中引用的内容
    【解决方案2】:

    如果您询问 MySQL 是否支持外键的 DEFERRABLE 属性(包括选项 INITIALLY DEFERRED),那么答案很明确。

    您不能将约束检查推迟到 MySQL 中的提交时间。

    而且 - 正如您已经指出的 - 它们总是在“行级别”而不是“语句级别”进行评估。

    【讨论】:

    • 我仍然找不到与此相关的任何内容。答案仍然是“否”吗?出于所有充分的理由,我正在考虑切换到 postgresql。
    • @akki:是的,答案仍然是否定的。 MySQL 不支持可延迟约束(或任何其他modern SQL 功能)
    【解决方案3】:

    您可以通过设置服务器变量暂时禁用外键检查来处理 innodb 引擎的这种限制:

    set foreign_key_checks=0;
    

    来自 MySQL 手册:

    mysqldump 还会在转储文件中生成正确的表定义,并且不会忘记外键。

    为了更容易为具有外键关系的表重新加载转储文件,mysqldump 自动在转储输出中包含一条语句以将 foreign_key_checks 设置为 0。这避免了在转储时必须以特定顺序重新加载表的问题被重新加载。也可以手动设置这个变量:

    mysql> SET foreign_key_checks = 0;
    mysql> SOURCE dump_file_name;
    mysql> SET foreign_key_checks = 1;
    

    【讨论】:

    • 我不确定这是否仍会在更新后检查约束,这正是我想要的。
    • 不,它没有,因此这个选项 foreign_key_checks=0 和类似的选项,如禁用唯一性检查非常、非常、非常危险。如果这很容易,那么 MySQL 可能也会实现延迟约束。这些选项仅用于在您确定不会违反任何约束时加速备份和恢复。您不能将此选项用作 MySQL 缺少延迟约束的解决方法。如果您重新启用该选项,则不会重复检查。特别是,如果违反了约束,那么 MySQL 可能会显示未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多