ERROR 1833(HY000):无法更改MySQL列

时间:2018-01-07 18:14:27

标签: mysql sql

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

  

ERROR 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;

enter image description here

2 个答案:

答案 0 :(得分:7)

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

似乎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;

答案 1 :(得分:0)

您可以关闭外键检查:

SET FOREIGN_KEY_CHECKS = 0;

/* DO WHAT YOU NEED HERE */

SET FOREIGN_KEY_CHECKS = 1;

使用AUTO_INCREMENT可能会遇到问题,因此可以使用:

错误1062:ALTER TABLE导致auto_increment重新排序,结果 重复输入“ 1”作为键“ PRIMARY”

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

SELECT @@sql_mode;

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

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

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