Sequel Pro 给已存在表添加外键报Cannot add foreign key constraint错误原因
MySQL创建外键报错
Cannot add foreign key constraint的常见原因 - 关联列属性不匹配:表A的主键
id和表B要设置外键的列,数据类型、无符号属性、字符集、排序规则任意一项不一致都会触发报错。比如表A的id是INT UNSIGNED,表B的关联列是普通INT,或者两者字符集分别为utf8mb4和utf8,都会导致校验失败。 - 存在不符合参照完整性的数据:表B的100行数据中,外键列存在表A
id列没有的取值。可以执行以下SQL排查无效数据:
清理掉不匹配的数据后再重新创建外键即可。SELECT DISTINCT <表B的外键列> FROM <表B> WHERE <表B的外键列> NOT IN (SELECT id FROM <表A>) - 存储引擎不支持外键:只有InnoDB引擎支持外键约束,如果两张表中任意一张用了MyISAM等其他引擎,就会创建失败,可以通过
SHOW CREATE TABLE <表名>语句检查存储引擎配置。 - 关联目标列不是主键/唯一索引:外键关联的表A
id列必须是主键或者设置了唯一索引,否则无法满足外键的唯一性校验要求。 - 外键约束名称重复:你要创建的外键约束名称已经在当前数据库中存在,可以手动指定唯一的约束名,修改创建语句为:
ALTER TABLE <表B> ADD CONSTRAINT <自定义唯一外键名> FOREIGN KEY (<表B的外键列>) REFERENCES <表A>(id) - 存在锁表或未提交事务:如果有其他会话正在锁定两张表中的任意一张,或者有未提交的事务对两张表做了修改,也会导致外键创建失败,可以提交所有事务或者重启数据库会话后重试。
内容的提问来源于stack exchange,提问作者auntR
相关产品推荐
相关产品推荐

