如何暂时禁用 MySQL 中的外键约束?
- 2025-01-03 08:41:00
- admin 原创
- 133
问题描述:
是否可以暂时禁用 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()
是否可以暂时禁用约束并删除?
解决方案 1:
尝试DISABLE KEYS
或
SET FOREIGN_KEY_CHECKS=0;
确保
SET FOREIGN_KEY_CHECKS=1;
后。
解决方案 2:
要全局关闭外键约束,请执行以下操作:
SET GLOBAL FOREIGN_KEY_CHECKS=0;
完成后记得将其放回原位
SET GLOBAL FOREIGN_KEY_CHECKS=1;
警告:您只应在进行单用户模式维护时执行此操作。因为这可能会导致数据不一致。例如,当您使用 mysqldump 输出上传大量数据时,这将非常有用。
解决方案 3:
我通常只在想要截断表时禁用外键约束,并且由于我不断回到这个答案,所以这对我未来来说很重要:
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;
解决方案 4:
要全局关闭外键约束:
SET GLOBAL FOREIGN_KEY_CHECKS = 0;
对于活动外键约束:
SET GLOBAL FOREIGN_KEY_CHECKS = 1;
解决方案 5:
不要禁用约束,而是将其永久修改为 ON DELETE SET NULL。这将完成类似的操作,并且您不必打开和关闭密钥检查。如下所示:
ALTER TABLE tablename1 DROP FOREIGN KEY fk_name1; //get rid of current constraints
ALTER TABLE tablename2 DROP FOREIGN KEY fk_name2;
ALTER TABLE tablename1
ADD FOREIGN KEY (table2_id)
REFERENCES table2(id)
ON DELETE SET NULL //add back constraint
ALTER TABLE tablename2
ADD FOREIGN KEY (table1_id)
REFERENCES table1(id)
ON DELETE SET NULL //add back other constraint
请阅读此内容(http://dev.mysql.com/doc/refman/5.5/en/alter-table.html)和此内容(http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html)。
解决方案 6:
对我来说这还SET FOREIGN_KEY_CHECKS=0;
不够。我还有com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException
。
我必须补充一点ALTER TABLE myTable DISABLE KEYS;
。
所以:
SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE myTable DISABLE KEYS;
DELETE FROM myTable;
ALTER TABLE myTable ENABLE KEYS;
SET FOREIGN_KEY_CHECKS=1;
解决方案 7:
使用phpMyAdmin的一个非常简单的解决方案:
在您的表中,转到
SQL
标签在您编辑要运行的 SQL 命令后,旁边会有一个
GO
名为“启用外键检查”的复选框。取消选中此复选框并运行 SQL。执行后将自动重新选中。
解决方案 8:
在phpMyAdmin中,您可以选择多行,然后单击删除操作。您将进入一个列出删除查询的屏幕。它看起来像这样:
请取消选中“启用外键检查”复选框,然后单击Yes
执行它们。
即使存在 ON DELETE 限制约束,这也使您能够删除行。
解决方案 9:
如果关键字段可空,那么您也可以在尝试删除它之前将其值设置为空:
cursor.execute("UPDATE myapp_item SET myapp_style_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed()
cursor.execute("UPDATE myapp_style SET myapp_item_id = NULL WHERE n = %s", n)
transaction.commit_unless_managed()
cursor.execute("DELETE FROM myapp_item WHERE n = %s", n)
transaction.commit_unless_managed()
cursor.execute("DELETE FROM myapp_style WHERE n = %s", n)
transaction.commit_unless_managed()
扫码咨询,免费领取项目管理大礼包!