如何临时禁用MySQL中的外键约束?
在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;
之后进行操作。