我尝试将自动增量添加到人员表的主键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;
答案 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';
在应用更改之前,请确保先进行备份。