MySQL foreign_key_checks会影响整个数据库吗?

Sea*_*yen 194 mysql

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

SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

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

Alm*_*lmo 234

它是基于会话的,当你按照问题的方式设置时.

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

据此FOREIGN_KEY_CHECKS,范围是"两者".这意味着可以为会话设置:

SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

或全球:

SET GLOBAL FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)


Ron*_*bar 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 -系统- variables.html


Bou*_*egh 12

正如罗恩所解释的,有两个变量,局部变量和全局变量.始终使用局部变量,并且与连接时的全局变量相同.

SET FOREIGN_KEY_CHECKS=0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable
Run Code Online (Sandbox Code Playgroud)

设置GLOBAL变量时,不会更改任何现有连接的本地变量.您还需要重新连接或设置本地变量.

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

如果希望外键完全一致,则需要在启用检查时添加键.

  • 假设您有一个引用id的表,但缺少一些引用的记录.如果在FOREIGN_KEY_CHECKS为ON时添加外键(FK),则Mysql将引发错误并拒绝添加FK,因为引用已损坏.当FOREIGN_KEY_CHECKS为OFF时添加外键时,mysql会继续运行而不会出错.即使您之后启用了检查,也不会出现错误.即使存在FK,您现在也有一个包含不一致数据的表.因此,FK的存在并不能保证数据库的一致性,除非在FK检查开启时添加它. (4认同)

小智 9

# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';
Run Code Online (Sandbox Code Playgroud)

如果您没有设置SET GLOBAL,则只会影响您的会话.