插入数据时遇MySQL 'Duplicate entry'错误,主键无重复仍报错
MySQL主键重复插入错误(Error 1062)排查与解决
排查方向(针对已确认无id=1记录、无触发器/存储过程的情况)
- 检查未提交事务:若之前有插入id=1的操作未提交,事务会占用主键。执行
ROLLBACK;回滚未提交事务,再执行SELECT * FROM users WHERE id=1;确认。 - 验证主键列类型与插入值匹配:执行
DESCRIBE users;查看id列的数据类型,确保插入的1与列类型一致(避免INT列插入字符串类型值导致的隐式冲突)。 - 检查额外唯一约束:执行
SHOW CREATE TABLE users;查看表结构,确认是否存在包含id的联合唯一键或其他唯一约束。 - 分区表排查:若users是分区表,可能某分区存在id=1的记录,执行
SELECT * FROM users PARTITION (分区名) WHERE id=1;逐个验证分区。 - 强制刷新查询:缓存可能导致查询结果不准确,执行
FLUSH TABLES;后再查询,或用SELECT * FROM users WHERE id=1 FOR UPDATE;强制读取最新数据。
无报错插入的解决方案
如果确认不存在冲突记录仍报错,或需要兼容重复场景,可使用以下SQL:
1. 忽略重复错误(存在则跳过,不存在则插入)
INSERT IGNORE INTO users (id, name, email) VALUES (1, 'John Doe', 'johndoe@example.com');
2. 替换现有记录(存在则覆盖,不存在则插入)
REPLACE INTO users (id, name, email) VALUES (1, 'John Doe', 'johndoe@example.com');
3. 存在则更新,不存在则插入
INSERT INTO users (id, name, email) VALUES (1, 'John Doe', 'johndoe@example.com') ON DUPLICATE KEY UPDATE name='John Doe', email='johndoe@example.com';
内容的提问来源于stack exchange,提问作者Opera Man
相关产品推荐
相关产品推荐

