当我试图改变我的桌子时,我收到了这个错误.
Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'
Run Code Online (Sandbox Code Playgroud)
这是我成功运行的CREATE TABLE STATEMENT.
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)
);
Run Code Online (Sandbox Code Playgroud)
然后我试图执行此语句,我得到了上述错误.
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)
Dem*_*tic 170
您可以关闭外键检查:
SET FOREIGN_KEY_CHECKS = 0;
/* DO WHAT YOU NEED HERE */
SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)
请确保不要在生产中使用它并备份.
Mic*_*eim 108
外键字段和引用的类型和定义必须相同.这意味着您的外键不允许更改字段的类型.
一个解决方案是:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Run Code Online (Sandbox Code Playgroud)
现在你可以改变你的person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Run Code Online (Sandbox Code Playgroud)
重新创建外键
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
编辑: 由于评论,上面添加了锁
在执行此操作时,您必须禁止写入数据库,否则可能会导致数据完整性问题.
我在上面添加了一个写锁
除了你自己的(INSERT, UPDATE, DELETE)之外的任何其他会话中的所有写入查询将等到超时或UNLOCK TABLES; 被执行
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
编辑2:OP要求更详细地解释"外键字段的类型和定义和引用必须相等.这意味着您的外键不允许更改字段的类型."
外键和引用键中的相应列必须在InnoDB内部具有类似的内部数据类型,以便可以在不进行类型转换的情况下对它们进行比较.整数类型的大小和符号必须相同.字符串类型的长度不必相同.对于非二进制(字符)字符串列,字符集和排序规则必须相同.
就我而言,有必要添加GLOBAL.
SET FOREIGN_KEY_CHECKS = 0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;
/* DO WHAT YOU NEED HERE */
SET FOREIGN_KEY_CHECKS = 1;
SET GLOBAL FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
97136 次 |
| 最近记录: |