首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中,我是否可以将参照完整性检查推迟到提交

在MySQL中,我是否可以将参照完整性检查推迟到提交
EN

Stack Overflow用户
提问于 2011-02-16 17:32:23
回答 3查看 17.6K关注 0票数 62

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-16 17:37:27

看来我的答案是here..。

与MySQL通常一样,在插入、删除或更新许多行的

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

回到绘图板。

票数 80
EN

Stack Overflow用户

发布于 2011-02-16 18:59:14

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

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

而且-正如你已经指出的-它们总是在“行级”而不是“语句级”进行计算。

票数 18
EN

Stack Overflow用户

发布于 2012-04-30 22:14:05

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

代码语言:javascript
复制
set foreign_key_checks=0;

摘自MySQL手册:

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

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

代码语言:javascript
复制
mysql> SET foreign_key_checks = 0;
mysql> SOURCE dump_file_name;
mysql> SET foreign_key_checks = 1;
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5014700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档