mysql报错:Duplicate entry ‘xx‘ for key ‘xxux1‘ 解决可行方案。已解决

web开发多次遇到Duplicate entry ‘xx’ for key ‘PRIMARY’ 报错或者Duplicate entry ‘xx‘ for key ‘xxux1‘

报错的原因

这是因为数据库对应的表字段设置了唯一索引.

1.报Duplicate entry ‘xx’ for key ‘PRIMARY’ 错

原因及解决方法
原因一:
对应表名称主键没有设置自增
解决方法:设置主键自增

原因二:
插入线程频率较高,没有处理好事务,造成插入sql执行顺序混乱
解决方法:把insert into 表名()values();修改为:insert ignore into 表名()values(); 

2.报Duplicate entry ‘xx’ for key ‘xxux1’ 错

错误例子:

数据库表结构

在这里插入图片描述

查询数据库对应表中的order_no的值为’202104250001’的记录,发现记录不存在

SELECT * FROM `orders` WHERE `active_flag`='y' AND `order_no`='202104250001'

在这里插入图片描述

插入新的一条数据,order_no与被物理删除了的某一条数据中的order_no相同,例如

INSERT INTO orders(order_no,DID,active_flag)VALUES('202104250001','96445553','y')

报错:

Duplicate entry '202104250001' for key 'orders_ux1'

在这里插入图片描述

原因及解决方法
原因:这是由于表中对应字段设置了唯一索引,在我们进行逻辑删除时,并没有真正的删除,只是标记为删除状态而已,
当我们再进行新增的时候,由于有唯一索引的限制,导致我们不能进行新增成功,所以报错.
解决方法1:
如果允许的话,把数据库中该字段的唯一索引限制去掉,这样后端可以进行逻辑删除,新增时即使与标记为删除的记录的字段值相等,由于没有唯一索引的限制,可以正常新增
解决方法2:
不需要去掉数据库中的唯一索引限制,但是当后端开发进行删除操作的时候,执行的是物理删除的sql语句(真正的删除),而不是逻辑删除,同时后端用逻辑判断,去查询数据库中是否有相同的编号存在,如果存在,则不允许新增,如果不存在,则可以新增
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐