【问题标题】:ERROR 1833 (HY000): Cannot change column MySQLERROR 1833 (HY000): 无法更改 MySQL 列
【发布时间】:2018-01-07 18:14:27
【问题描述】:

我正在尝试将自动增量添加到人员表的主键 person_id。但是,当我运行命令时,出现以下错误。

错误 1833 (HY000):无法更改列“person_id”:用于 表的外键约束“fk_fav_food_person_id” 'bank.favorite_food'

对于以下命令。我使用的是 MySQL 5.7.20

mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    因为外键必须与它们引用的列的数据类型相匹配,所以更改列的数据类型可能会扰乱引用它的外键是有道理的。

    似乎 MySQL 对此有保护措施,并拒绝修改列的尝试。但是检查您所做的特定修改是否会改变数据类型还不够聪明。它只是拒绝任何修改该列的尝试。

    您可以通过暂时禁用外键检查来解决此问题。我重新创建了您的表格并确认了它:

    mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
    ERROR 1833 (HY000): Cannot change column 'person_id': used in a foreign key constraint 'favorite_food_ibfk_1' of table 'test.favorite_food'
    
    mysql> set foreign_key_checks=0;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
    Query OK, 0 rows affected (0.08 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> set foreign_key_checks=1;
    

    【讨论】:

    • 我希望通过 O'Reilly 的“Learning SQL”工作的其他人也能找到这个很好的答案。
    【解决方案2】:

    您可以关闭外键检查:

    SET FOREIGN_KEY_CHECKS = 0;
    
    /* DO WHAT YOU NEED HERE */
    
    SET FOREIGN_KEY_CHECKS = 1;
    

    如果使用 AUTO_INCREMENT,您可能会遇到问题,您可以使用:

    ERROR 1062: ALTER TABLE 导致 auto_increment 重新排序,导致 在键“PRIMARY”的重复条目“1”中

    通过此查询获取 sql_mode 的当前值:

    SELECT @@sql_mode;
    

    然后使用以下查询将 sql_mode 设置为 NO_AUTO_VALUE_ON_ZERO:

    SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';
    

    确保在应用更改之前进行备份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 2018-10-08
      • 1970-01-01
      • 2013-09-26
      • 2014-03-27
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多