在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;