mysql临时关闭约束_关于sql:如何暂时禁⽤MySQL中的外键
约束?
是否有可能暂时禁⽤MySQL中的约束?
我有两个Django模型,每个模型都有⼀个ForeignKey到另⼀个。 由于ForeignKey约束,删除模型的实例会返回错误:
法国国庆日
是否可以暂时禁⽤约束并删除?
要么我没有得到你想做的,要么你想要做的是⾮常,⾮常,⾮常丑陋。即使你能做到,你也许不应该这样做。
删除并重新应⽤FK正在改变您的数据库。你试图挑战允许系统看到某种意义的限制因素,它并不认为FK可能是⼀个暂时的东西,如果它确实知道,那就会引起恐慌。
你想做什么很奇怪。但是你使⽤的是哪个数据库?
@andrefsp:我正在使⽤MySQL。我将编辑我的问题以添加它。
如果您将其永久修改为ON DELETE SET NULL⽽不是禁⽤约束,该怎么办?这将完成类似的事情,你不必打开和关闭键检查。
@dnagirl:确实会更好。我怎样才能做到这⼀点?
你应该按照@dnagirl的要求去做。它的⽅式更合理,并且确保您不会以⾮常讨厌的⽅式处理数据。像你想做的那样玩它可能会导致严重的完整性和⼀致性问题。
试试DISABLE KEYS或
SET FOREIGN_KEY_CHECKS=0;
确保
SET FOREIGN_KEY_CHECKS=1;
后。
这是为mysql整体设置还是仅为该会话设置的东西?
黄豆种植方法我相信这是每次会议。
清理系统垃圾代码我可以为单个表禁⽤FOREIGN_KEY_CHECKS吗?
@Pacerier从阅读中看,它似乎可以,但仅适⽤于单个会话。
要全局关闭外键约束,请执⾏以下操作:
SET GLOBAL FOREIGN_KEY_CHECKS=0;
并记得在完成后将其设置回来
SET GLOBAL FOREIGN_KEY_CHECKS=1;
警告:只有在进⾏单⽤户模式维护时才应执⾏此操作。因为它可能导致数据不⼀致。例如,当您使⽤mysqldump输出上载⼤量数据时,它将⾮常有⽤。
这是我需要知道的,所以这不是很好的练习,但这个家伙的回答应该是得分更⾼......
在尝试"最佳答案"后,这对我有⽤。也许可以添加对差异的解释。
@hexnet区别在于只有SET FOREIGN_KEY_CHECKS才会更改当前连接的值,⽽SET GLOBAL ..会更改所有连接的值,包括将来的连接。如果你只是在⼀个窗⼝中执⾏SET FOREIGN..,那么尝试在不同的窗⼝(通过不同的连接)中应⽤该语句,那⾥的值没有改变。对于GLOBAL,两个连接的相同变量具有相同的值。
回放更⼤的转储(6+ GB)<3时,唯⼀可以帮助我的东西
这对我不起作⽤。当我尝试时,我看到:ERROR 1228 (HY000): Variable 'foreign_key_checks' is a SESSION variable and can't be ud with SET GLOBAL豆豉是什么
尝试UPPERCASE @MikeB
@berniey没有运⽓。不过没关系。我使⽤alter语句暂时禁⽤外键约束。
@MikeB,我认为它与您⽤来发出命令的⼯具有关(它与myqsl命令⾏⼯具⼀起使⽤)。我⼀直在v5.5和5.6上使⽤该命令,它⼯作正常。⽂档建议甚⾄适⽤于v5.7。 /doc/refman/5.7/en/rver-system-variables.html。此外,案件⽆关紧要(请原谅我之前的建议)
请注意,如果连接到在发出全局查询之前启⽤了外键检查的MySQL,则会保留外键检查的当前会话状态。即SET GLOBAL
FOREIGN_KEY_CHECKS=0; SELECT @@FOREIGN_KEY_CHECKS;将返回1,直到您重新连接以开始新会话
我通常只在我要截断表时才禁⽤外键约束,因为我不断回到这个答案,这是为了将来我:qq技巧
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE table;
SET FOREIGN_KEY_CHECKS=1;
不是禁⽤约束,⽽是永久地将其修改为ON DELETE SET NULL。这将完成类似的事情,你不必打开和关闭键检查。像这样:
注意更改表可能需要很长时间,最好将服务器全局设置为FOREIGN_KEY_CHECKS为0,并在脏⼯作完成后将其重新放回。除此之外它可能会锁定写表。
改变远程列类型时不会破坏引⽤吗? (似乎我的客户端将修改后的临时表重命名为原始表名。)
要全局关闭外键约束:
SET GLOBAL FOREIGN_KEY_CHECKS = 0;
并⽤于活动外键约束
SET GLOBAL FOREIGN_KEY_CHECKS = 1;
phpmyadmin的⼀个⾮常简单的解决⽅案:
在表格中,转到SQL选项卡
编辑要运⾏的SQL命令后,GO旁边会出现⼀个复选框,名为"启⽤外键检查"。
取消选中此复选框并运⾏SQL。它将在执⾏后⾃动重新检查。
谢谢!确实,解决⽅案SET FOREIGN_KEY_CHECKS=0; ..... SET FOREIGN_KEY_CHECKS=1;在PHPMyAdmin中对我不起作⽤,因为我忘了取消选中"启⽤外键检查"复选框。在PHPMyAdmin中,您可以跳过这些SET命令,只需取消选中该复选框即可。
如果键字段可以为空,那么您也可以在尝试删除它之前将该值设置为null:
茉莉花茶的好处
世界上最早的大学
对我来说,SET FOREIGN_KEY_CHECKS=0;还不够。
万古霉素说明书我还有⼀个ptions.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;
仅供参考,mySQL 5.7抛出警告,运⾏DISABLE KEYS命令时InnoDB引擎没有此选项。
这确实有效,没有改变表它也不适合我
在phpMyAdmin中,您可以选择多⾏,然后单击删除操作。您将进⼊⼀个列出删除查询的屏幕,您可以取消选中外键检查,然后单击是以执⾏它们。
即使存在ON DELETE限制约束,这也可以删除⾏。
将外键约束设置为0并不是⼀个好主意,因为如果这样做,您的数据库将⽆法确保它不会违反参照完整性。这可能会导致数据不准确,误导或不完整。
您出于某种原因创建外键:因为⼦列中的所有值都应与⽗列中的值相同。如果没有外键约束,⼦⾏可以具有不在⽗⾏中的值,这将导致不准确的数据。
例如,假设您有⼀个供学⽣登录的⽹站,每个学⽣都必须以⽤户⾝份注册帐户。您有⼀个⽤户ID表,⽤户ID作为主键;和另⼀个学⽣帐户表,学⽣ID为专栏。由于每个学⽣都必须拥有⽤户ID,因此从学⽣帐户表中将学⽣ID作为引⽤⽤户ID表中的主键⽤户ID的外键是有意义的。如果没有外键检查,学⽣可能最终拥有学⽣ID⽽没有⽤户ID,这意味着学⽣可以在不是⽤户的情况下获得帐户,这是错误的。
想象⼀下,如果它发⽣在⼤量数据上。这就是你需要外键检查的原因。
最好找出导致错误的原因。您很可能尝试从⽗⾏删除⽽不从⼦⾏中删除。在从⽗⾏删除之前尝试从⼦⾏中删除。
没错,总会有⼀个权衡。
没⼈说要永远这样运⾏它。您关闭约束,批量加载某些数据,然后重新打开它。没什么⼤不了的,⼈们总是这样做。
对于批量进⼝是必要的,⾄少对于性能来说,它是⾮常普遍的。有时您只需要恢复数据,然后您可以进⾏检查。
这不是问题的答案。
请注意,他的问题是暂时如何做到这⼀点。执⾏某些维护和数据导⼊时需要这样做。需要注意的是,导⼊脚本会对数据完整性负责。然后,稍后当重新打开索引和约束时,db将告诉您某些内容是否已损坏。
你有没有⽤过phpMyAdmin?