在MySQL中,我可以推迟引用完整性检查,直到提交

正如在这个问题中 ,我一直在阅读PoEAA,并想知道是否有可能推迟引用完整性检查,直到在MySQL提交。

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

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

我会很感激你可以提供任何帮助。

看起来我的答案在这里 …

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

回到绘图板。

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

你不能推迟约束检查,直到MySQL的提交时间。

而且,正如你已经指出的那样,它们总是以“行级”而不是“语句级”进行评估。

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

 set foreign_key_checks=0; 

从MySQL手册:

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

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

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