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

一定要

SET FOREIGN_KEY_CHECKS=1;

后。

其他回答

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

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

关闭全局外键约束:

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

对于主动外键约束:

SET GLOBAL FOREIGN_KEY_CHECKS = 1;

尝试禁用键或

SET FOREIGN_KEY_CHECKS=0;

一定要

SET FOREIGN_KEY_CHECKS=1;

后。

与其禁用约束,不如将其永久修改为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)。

对我来说,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;