是否可以暂时禁用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()

是否有可能暂时禁用约束并删除?


当前回答

对我来说,SET FOREIGN_KEY_CHECKS=0;是不够的。 我仍然有一个com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException。

我不得不添加ALTER TABLE myTable禁用键;。

So:

SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE myTable DISABLE KEYS;
DELETE FROM myTable;
ALTER TABLE myTable ENABLE KEYS;
SET FOREIGN_KEY_CHECKS=1;

其他回答

在phpMyAdmin中,您可以选择多行,然后单击删除操作。您将进入一个列出删除查询的屏幕。它是这样的:

请取消选中“启用外键检查”复选框,然后单击“是”执行它们。

这将使您能够删除行,即使有一个ON delete限制约束。

phpMyAdmin的一个非常简单的解决方案:

在您的表中,转到SQL选项卡 在编辑要运行的SQL命令后,在GO旁边有一个复选框,名为“启用外键检查”。 取消选中此复选框并运行SQL。执行后将自动重新检查。

关闭全局外键约束:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

对于主动外键约束:

SET GLOBAL FOREIGN_KEY_CHECKS = 1;

要在全局范围内关闭外键约束,请执行以下操作:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

完成后记得把它调回去

SET GLOBAL FOREIGN_KEY_CHECKS=1;

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

当我想要截断一个表时,我通常只禁用外键约束,因为我一直回到这个答案,这是为未来的我:

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