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语句(真正的删除),而不是逻辑删除,同时后端用逻辑判断,去查询数据库中是否有相同的编号存在,如果存在,则不允许新增,如果不存在,则可以新增