我正在尝试将自动增量添加到主键 person_id 一个人的table。但是,当我运行命令时,我得到以下错误。错误1833(hy000):无法更改列“person\u id”:用于表“bank.favorite\u food”的外键约束“fk\u fav\u food\u person\u id”我使用的是mysql 5.7.20
person_id
mysql> ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
wlsrxk511#
因为外键必须与它们引用的列的数据类型匹配,所以更改列的数据类型可能会打乱引用它的外键是有意义的。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;
3pmvbmvn2#
您可以关闭外键检查:
SET FOREIGN_KEY_CHECKS = 0; /* DO WHAT YOU NEED HERE */ SET FOREIGN_KEY_CHECKS = 1;
使用自动增量,您可能会遇到问题,为此,您可以使用:错误1062:alter table导致自动增量重新排序,导致键“primary”的条目“1”重复通过此查询获取sql\ U模式的当前值:
SELECT @@sql_mode;
然后使用下面的查询将sql\模式设置为no\ auto\ value\ on\ u zero:
SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';
确保在应用更改之前进行备份。
2条答案
按热度按时间wlsrxk511#
因为外键必须与它们引用的列的数据类型匹配,所以更改列的数据类型可能会打乱引用它的外键是有意义的。
mysql似乎对此有一个保护措施,并拒绝修改该列。但是,检查您所做的特定修改是否会改变数据类型还不够明智。它只是否认任何修改该列的企图。
您可以通过临时禁用外键检查来解决此问题。我重新创建了您的表并确认了它:
3pmvbmvn2#
您可以关闭外键检查:
使用自动增量,您可能会遇到问题,为此,您可以使用:
错误1062:alter table导致自动增量重新排序,导致键“primary”的条目“1”重复
通过此查询获取sql\ U模式的当前值:
然后使用下面的查询将sql\模式设置为no\ auto\ value\ on\ u zero:
确保在应用更改之前进行备份。