MySql插入数据时错误Duplicate entry '131' for key 'PRIMARY'

本文介绍了一种在使用MyBatis进行数据库操作时遇到的MySQL主键重复异常问题及其解决办法。通过调整MyBatis的插入方法可以避免在设置为主键自增长的情况下出现重复主键错误。

今天在进行开发的过程中,遇到MySQL数据库插入数据时抛出异常:

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '131' for key 'PRIMARY'


左上角的红色部分是我已经插入正确的数据,这个错误的出现感觉是随机的。

顺便讲一下我这个错误出现的过程:我通过一个循环操作来向数据库中的某张表进行数据的插入,数据层我使用的是MyBatis,我们都知道MyBatis自动生成的xxxMapper.java类中有很多基本的操作数据库的方法,我就是调用了里面的insert方法。然后就出现了上面的异常。

从错误信息中我们可以知道该错误的出现是因为插入数据时主键已经在数据库表中已经存在。但是,我就纳闷了,我MySql数据库中该表的主键设置是自动增长的,难不成没有增长,但是,它又有部分的数据插入成功,这就更让人纳闷了。因此,我通过查找MyBatis的相关资料,找到了解决方案。

解决的方法:找到MyBatis系统自动生成的insert方法。并将红色部分去掉。


因为我们设置的是主键自增长,所以在插入的时候不需要插入主键字段了并且不需要查找主键最大值。


### 解决 MySQL 错误 1062 主键 'PRIMARY' 重复条目 当尝试向数据插入一条记录,如果该记录的主键值已经存在于表中,则会触发错误 `ERROR 1062 (23000): Duplicate entry`。对于这种情况,有几种常见的解决方案。 #### 使用 INSERT ... ON DUPLICATE KEY UPDATE 一种优雅的方法是在遇到冲突更新现有记录而不是抛出异常。语法如下: ```sql INSERT INTO table_name (column_list) VALUES (value_list) ON DUPLICATE KEY UPDATE column_name=VALUES(column_name); ``` 此命令允许指定哪些字段应该被更新,并且只会在发生唯一约束违反的情况下执行更新操作[^1]。 #### 替换插入 REPLACE INTO 或者使用 IGNORE 关键字 另一种方式是利用 `REPLACE INTO` 来替代普通的 `INSERT` 语句;它的工作原理是从目标表格删除任何与新行具有相同唯一关键字组合的老行并插入新的行。然而需要注意的是这种方法可能会破坏外键关系并且不是最佳实践。更推荐的做法是采用带有 `IGNORE` 的插入形式: ```sql INSERT IGNORE INTO table_name SET id='80', other_column='some_value'; ``` 这样可以忽略因主键或其他唯一索引引起的重复项而不会中断整个事务处理流程[^4]。 #### 数据清理和验证 在某些情况下,可能是由于应用程序逻辑缺陷导致试图插入已存在的ID。因此,在应用层面做适当的数据校验是非常重要的。另外也可以考虑定期运行脚本来查找并修正潜在的问题数据集,比如设置自增列作为主键来防止手动输入带来的风险[^2]。 #### 修改现有的主键策略 考虑到业务需求的变化,有重新设计表结构也是必要的选项之一。例如将自然码改为代理键(surrogate key),即让系统自动分配唯一的标识符给每条记录从而规避人为因素造成的冲突可能性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值