如何解决MySQL报错#1022:无法写入,表'Lives_in'中存在重复键
MySQL 1022报错解决方案
报错1022的核心原因是同数据库下存在重复的约束名,MySQL要求同一个库中所有约束(主键、外键、唯一键等)的名称全局唯一,出现该报错基本是你定义cust_id和add_id两个外键时使用了重复的约束名,或是之前创建过同名约束未清理。
解决步骤
- 第一步:先查询当前库已有的约束名,排查重复项
执行如下SQL,将你的数据库名替换为实际名称:
查看你准备设置的两个外键名是否已经存在于查询结果中。SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = '你的数据库名'; - 第二步:修改SQL语句,为两个外键指定唯一的约束名
正确操作示例(修改已存在的表场景):
如果是可视化工具(Navicat、PHPMyAdmin等)操作,不要用工具默认生成的外键名,手动修改为不重复的名称即可。-- 先设置联合主键 ALTER TABLE 你的表名 ADD PRIMARY KEY (id, cust_id, add_id); -- 为cust_id设置外键,指定唯一约束名 ALTER TABLE 你的表名 ADD CONSTRAINT `fk_表名_cust_id` FOREIGN KEY (`cust_id`) REFERENCES 关联客户表(`关联字段`); -- 为add_id设置外键,指定唯一约束名 ALTER TABLE 你的表名 ADD CONSTRAINT `fk_表名_add_id` FOREIGN KEY (`add_id`) REFERENCES 关联地址表(`关联字段`); - 第三步:残留约束清理
如果执行仍报错,先删除该表之前残留的旧约束再重新操作,删外键示例:ALTER TABLE 你的表名 DROP FOREIGN KEY 旧外键约束名;
注意事项
外键关联的父表字段,类型、长度、排序规则必须和子表对应字段完全一致,否则也会触发关联异常。
内容的提问来源于stack exchange,提问作者rikansha
相关产品推荐
相关产品推荐

