当我试图改变我的桌子时,我犯了这个错误.

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

然后我try 执行这个语句,我得到了上面的错误.

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

推荐答案

外键字段和引用的类型和定义必须相同.

一个解决方案是:

LOCK TABLES 
    favorite_food WRITE,
    person WRITE;

ALTER TABLE favorite_food
    DROP FOREIGN KEY fk_fav_food_person_id,
    MODIFY person_id SMALLINT UNSIGNED;

现在你可以改变你的身份了

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

重新创建外键

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

UNLOCK TABLES;

EDIT:

当你这么做的时候,你必须禁止写入数据库,

我在上面添加了一个写锁

除您自己的会话(INSERT, UPDATE, DELETE)之外的任何其他会话中的所有写入查询都将等待超时或UNLOCK TABLES;被处决

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

编辑2:OP要求对"外键字段和引用的类型和定义必须相等.这意味着外键不允许更改字段的类型"这一行进行更详细的解释

MySQL 5.5 Reference Manual: FOREIGN KEY Constraints

外键和引用键中的相应列必须

Mysql相关问答推荐

如何改进对另一个表中多行的查询依赖性

嵌套MySQL语句问题

找出同一表中列A中的每个值在列B中出现的次数

从insert语句获取新生成的虚拟UUID

Group_CONCAT CASE 乘法输出

SQL查询连接到多个类别的项目

MySQL MDL(元数据锁)为什么会导致死锁?

如何确保 SQL 记录的列不引用它自己的主键?

列出每年最多产的三位作家

Mysql 查询返回未定义的 node.js

Select 并统计所有条目并根据条目对它们进行分组

如何在 mysql 的 group by 子句中 Select 最后创建的记录?

将sql查询转换为sequelize

MySQL如何在小时和分钟之间 Select 时间

为什么一个 10 位的电话号码不能存储在长度为 10 的整数中?

MySQL IF() 函数根据指定条件执行代码块

是否可以从 .SQL 文件中计算表中的行数?

无法在两个 mysql 表上执行内部联接

如何通过 mysql workbench 将数据导入 mysql 数据库?

如何在 MySQL 中为用户设置默认架构