MySQL foreign_key_checks是否会影响整个数据库?


201

当我在MySQL中执行此命令时:

SET FOREIGN_KEY_CHECKS=0;

它会影响整个引擎还是仅仅是我当前的交易?


15
测试:登录mysql:显示类似'%FOREIGN%'的变量; SET FOREIGN_KEY_CHECKS = 0; 之后,使用其他控制台登录mysql。我可以看到像'%FOREIGN%'这样的show变量是ON而不是OFF。
肖恩·阮

Answers:



98

实际上,有两个foreign_key_checks变量:全局变量和局部(每个会话)变量。连接后,会话变量将初始化为全局变量的值。
该命令SET foreign_key_checks修改会话变量。
要修改全局变量,请使用SET GLOBAL foreign_key_checksSET @@global.foreign_key_checks

请查阅以下手册部分:
http : //dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server -system-variables.html


1
在每个请求上设置foreign_key_checks是否代价高昂?我有一个脚本来升级数据库,并且我不希望其他人在升级过程中默认情况下可以覆盖外键检查。因此,我将进行数百万次查询,我想知道SET是否有意义?
Aki

@Aki如果您要升级数据库,我想您最好不要锁定其他所有人的访问权限。至少是为了写作。否则,您会遇到各种并发访问问题。
tishma

1
很好的答案和区别。重要的是要意识到其工作原理的后果。这意味着您无法设置GLOBAL,foreign_key_checks并且在同一会话中期望它忽略外键约束。您需要设置非全局变量。
泰勒·科利尔

12

正如罗恩(Ron)解释的那样,有两个变量,局部变量和全局变量。始终使用局部变量,并且在连接时与全局变量相同。

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable

设置GLOBAL变量时,对于任何现有连接都不会更改本地变量。您还需要重新连接或设置局部变量。

也许不直观,重新启用FOREIGN_KEY_CHECKS时,MYSQL不会强制执行外键。即使启用了外键和检查,也可以创建不一致的数据库。

如果您希望外键完全一致,则需要在启用检查的同时添加这些键。


1
您能否详细说明...?“如果希望外键完全一致,则需要在启用检查的同时添加键。”
user2782001 '16

4
假设您有一个带有引用ID的表,但是缺少一些引用记录。如果在FOREIGN_KEY_CHECKS为ON的情况下添加外键(FK),则Mysql将引发错误并由于引用损坏而拒绝添加FK。当您在FOREIGN_KEY_CHECKS为OFF的情况下添加外键时,mysql继续运行而没有错误。即使以后启用检查,也不会出现错误。现在,即使有FK,您的表中的数据也不一致。这样,除非在启用FK检查时将其添加,否则FK的存在不能保证数据库的一致性。
Bouke Versteegh

10
# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';

如果您未设置GLOBAL,则只会影响您的会话。


1

当我尝试将Drupal数据库迁移到新的本地apache服务器时,我遇到了相同的错误(我在Windows计算机上使用XAMPP)。实际上,我不知道此错误的含义,但是在尝试了以下步骤之后,我没有错误地导入了数据库。希望这可以帮助:

在C:\ xampp \ php \ php.ini中更改php.ini

max_execution_time = 600
max_input_time = 600
memory_limit = 1024M
post_max_size = 1024M

在C:\ xampp \ mysql \ bin \ my.ini中更改my.ini

max_allowed_packet = 1024M

-2

如果使用Mysql查询浏览器,SET FOREIGN_KEY_CHECKS=0;则在1.1.20版中没有任何影响。但是,它在Mysql查询浏览器1.2.17上可以正常工作

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.