【问题标题】:Does MySQL foreign_key_checks affect the entire database?MySQL foreign_key_checks 会影响整个数据库吗?
【发布时间】:2012-01-22 05:50:51
【问题描述】:

当我在 MySQL 中执行这个命令时:

SET FOREIGN_KEY_CHECKS=0;

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

【问题讨论】:

  • 测试:登录 mysql:显示变量,如 '%FOREIGN%';SET FOREIGN_KEY_CHECKS=0;之后使用不同的控制台登录 mysql。我可以看到像 '%FOREIGN%' 这样的显示变量是 ON 而不是 OFF。

标签: mysql


【解决方案1】:

它是基于会话的,当设置您在问题中所做的方式时。

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

据此,FOREIGN_KEY_CHECKS 是范围的“两者”。这意味着它可以为会话设置:

SET FOREIGN_KEY_CHECKS=0;

或全局:

SET GLOBAL FOREIGN_KEY_CHECKS=0;

【讨论】:

    【解决方案2】:

    实际上,有两个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

    【讨论】:

    • 在每个请求上设置 foreign_key_checks 成本高吗?我有一个脚本来升级数据库,我不希望其他人能够在升级期间默认覆盖外键检查。所以我会进行数百万次查询,我想知道 SET 是否重要?
    • @Aki 如果您正在升级数据库,我会说您最好锁定其他所有人的访问权限。至少对于写作来说。否则,您可能会遇到各种并发访问问题。
    • 很好的答案和区别。重要的是要认识到它是如何工作的后果。这意味着您不能设置 GLOBAL foreign_key_checks 并且在同一会话中希望它忽略外键约束。您需要设置非全局变量。
    【解决方案3】:

    正如 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 不会强制执行外键。这使得即使打开外键和检查也可以创建不一致的数据库。

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

    【讨论】:

    • 你能详细说明一下吗......“如果你想让你的外键完全一致,你需要在检查时添加键。”
    • 假设您有一个引用 id 的表,但缺少一些引用记录。如果在 FOREIGN_KEY_CHECKS 为 ON 时添加外键 (FK),则 Mysql 将引发错误并拒绝添加 FK,因为引用损坏。当您在 FOREIGN_KEY_CHECKS 为 OFF 时添加外键时,mysql 继续运行而不会出错。即使您之后启用检查,也不会出现错误。您现在有一个包含不一致数据的表,即使有一个 FK。因此,FK 的存在并不能保证数据库的一致性,除非它是在 FK 检查开启时添加的。
    【解决方案4】:
    # will get you the current local (session based) state.
    SHOW Variables WHERE Variable_name='foreign_key_checks';
    

    如果您没有 SET GLOBAL,则只有您的会话受到影响。

    【讨论】:

      【解决方案5】:

      当我尝试将 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
      

      【讨论】:

        【解决方案6】:

        如果使用Mysql查询浏览器,SET FOREIGN_KEY_CHECKS=0;对1.1.20版本没有任何影响。但是,它在 Mysql 查询浏览器 1.2.17 上运行良好

        【讨论】:

          猜你喜欢
          • 2021-09-18
          • 1970-01-01
          • 2014-12-16
          • 1970-01-01
          • 2017-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多