无法更改在外键约束中使用的列

当我试图改变我的表时,我得到了这个错误。

Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food' 

这是我的CREATE TABLE语句成功运行。

 CREATE TABLE favorite_food( person_id SMALLINT UNSIGNED, food VARCHAR(20), CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food), CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id) ); 

然后我试图执行这个声明,我得到了上述错误。

 ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT; 

外键字段和引用的types和定义必须相同。 这意味着你的外键不允许改变你的字段的types。

一个解决scheme是这样的:

 LOCK TABLES favorite_food WRITE, person WRITE; ALTER TABLE favorite_food DROP FOREIGN KEY fk_fav_food_person_id, MODIFY person_id SMALLINT UNSIGNED; 

现在你可以改变你的person_id

 ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT; 

重新创build外键

 ALTER TABLE favorite_food ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id); UNLOCK TABLES; 

编辑:添加上面的锁,感谢评论

当你这样做的时候,你不得不写数据库,否则你会冒数据完整性的问题。

我已经在上面添加了一个写锁

除了你自己的( INSERT, UPDATE, DELETE )之外的所有其他会话中的查询都将等待超时或UNLOCK TABLES ; 被执行

http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

编辑2:OP要求更详细的说明行“外键字段和引用的types和定义必须相等,这意味着您的外键不允许更改您的字段的types。

从MySQL 5.5参考手册:FOREIGN KEY约束

外键和引用键中的相应列必须在InnoDB内部具有相似的内部数据types,以便可以在不进行types转换的情况下进行比较。 整数types的大小和符号必须相同。 stringtypes的长度不需要相同。 对于非二进制(字符)string列,字符集和归类必须相同。

您可以closures外键检查:

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

请确保不要在生产中使用此function并进行备份。

正如你已经回答了你自己的问题。 您正在亲自引用person_id,并将其修改为自动递增

当您设置键(主键或外键)时,您正在设置如何使用键的限制,这又限制了您可以对键进行的操作。 如果你真的想改变列,你可以重新创build表没有约束,虽然我build议反对它。 一般来说,如果你有一个你想要做某事的情况,但是它被一个约束所阻挡,最好通过改变你想要做的而不是约束来解决。