如何临时禁用MySQL中的外键约束?

826 投票
10 回答
895602 浏览
提问于 2025-04-17 19:38

在MySQL中,有办法暂时关闭约束吗?

我有两个Django模型,它们之间互相有外键关联。当我试图删除其中一个模型的实例时,由于外键约束,系统会报错:

cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()  #a foreign key constraint fails here

cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()

那么,有办法暂时关闭这些约束,然后继续删除吗?

10 个回答

78

我通常只在想要清空一个表的时候才会禁用外键约束。因为我总是回来看这个答案,所以这是留给未来我的:

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;
191

要全局关闭外键约束,可以按照以下步骤操作:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

记得在完成后再把它设置回来哦。

SET GLOBAL FOREIGN_KEY_CHECKS=1;

警告:你只应该在单用户模式下进行维护时这样做。因为这样可能会导致数据不一致。例如,当你使用mysqldump输出上传大量数据时,这样做会非常有帮助。

1770

试试用 DISABLE KEYS,或者

SET FOREIGN_KEY_CHECKS=0;

确保在

SET FOREIGN_KEY_CHECKS=1;

之后进行操作。

撰写回答