Mysql处理Duplicate entry ‘6‘ for key ‘PRIMARY‘问题及解决

 更新时间:2022年06月06日 09:57:54   作者:net亮  
这篇文章主要介绍了Mysql处理Duplicate entry ‘6‘ for key ‘PRIMARY‘问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mysql处理Duplicate entry ‘6‘ for key ‘PRIMARY‘

在业务中app和设备都需要调用ip查询对应城市的天气接口,出现了ip这个唯一索引引起的插入冲突。

以前单系统处理这种主键冲突或唯一索引冲突,都是先查询后插入。

使用 if-else语句,判断dp_city是否存在,若存在则更新,不存在则插入。

if not exists (select ip from dp_city where ip = adress)
      insert into dp_city (ip ,name,...) values(adress,name,...)
else
      update dp_city set name= 'name',... where ip = adress

但这样写不仅效率太差,每次都需要执行两条SQL语句,一条语句用来判断dp_city是否在表中已经存在,另一条语句用来插入或更新表中数据。

而且在高并发的场景下,两个请求同一时刻都查到数据不存在,一个请求先插入数据,另一个请求再插入数据时就会出现主键或索引冲突的异常,也不能保证原子性。

解决这个问题最常规的做法是:加锁 

加数据库悲观锁太影响性能;加数据库乐观锁,基于版本号判断,一般用于更新操作,像这种插入操作基本上不会用。

另一种办法是使用redis加入基于redis的分布式锁,锁定已存在的ip。但也如果过度依赖redis,若是出现网络超时,服务就悲剧了。

那么有没有更优雅高效的方法呢,通过查阅资料,发现MySQL一条语句很好的解决了这个问题:ON DUPLICATE KEY UPDATE

该语句的语法如下:

INSERT INTO tablename(field1,field2, field3, ...) VALUES(value1, value2, value3, ...) ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...; 

这个语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。

该语句规则如下:

如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。 

mysql1062错误:Duplicate entry ‘...‘ for key ‘PRIMARY

问题解释

Duplicate entry ‘…’ for key ‘PRIMARY,即插入数据时,要插入数据的主键数据(…)已经存在,不能再重复添加了。

例:Duplicate entry ‘0’ for key ‘PRIMARY是指主键为0的数据已经存在,不能再插入主键值为0的数据了。

问题解决

在执行插入操作insert前,可以先执行一遍该主键值的查找操作select

【简单的来说,就是这个语句已经执行过了,无需重复执行】

1062、1060报错都是一样的

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 删除MySQL表中重复数据详解

    删除MySQL表中重复数据详解

    这篇文章主要为大家介绍了删除MySQL表中重复数据详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • mysql 存在该记录则更新,不存在则插入记录的sql

    mysql 存在该记录则更新,不存在则插入记录的sql

    非常不错的功能,主要用于更新特定的记录,如果存在这条记录则更新一下,如果不存在则插入记录。应用于配置文件等。
    2010-04-04
  • MySQL表聚合与联合查询的实现

    MySQL表聚合与联合查询的实现

    MySQL聚合与联合查询是数据库查询中常用的技术,它们能够从多个数据源中提取和组合数据,以获得有用的信息和结果,本文就来介绍下MySQL聚合与联合查询,感兴趣的可以了解一下
    2023-10-10
  • MySQL数据库连接异常汇总(值得收藏)

    MySQL数据库连接异常汇总(值得收藏)

    这篇文章主要介绍了MySQL数据库连接异常汇总,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
    2020-08-08
  • SQL Server 完整备份遇到的一个不常见的错误及解决方法

    SQL Server 完整备份遇到的一个不常见的错误及解决方法

    这篇文章给大家介绍了SQL Server 完整备份遇到的一个不常见的错误及解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-05-05
  • mysql不区分大小写配置小结

    mysql不区分大小写配置小结

    在某些情况下,我们可能希望数据库忽略大小写,以便更方便地进行操作,本文主要介绍了mysql不区分大小写配置,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 细谈Mysql的存储过程和存储函数

    细谈Mysql的存储过程和存储函数

    存储函数与存储过程作用类同,不同的是存储过程只能使用CALL语句来调用存储过程,只能用输出变量返回值,而存储函数可以从语句外调用(即通过引用函数名),也能返回标量值。下面小编给大家详细讲一讲
    2019-05-05
  • mysql索引失效的常见九种原因图文详解

    mysql索引失效的常见九种原因图文详解

    索引失效这个问题的前提应该是建立了索引,却没有使用到,或者没有完全使用到,下面这篇文章主要给大家介绍了关于mysql索引失效的常见九种原因的相关资料,需要的朋友可以参考下
    2022-06-06
  • 详解MySQL中事务隔离级别的实现原理

    详解MySQL中事务隔离级别的实现原理

    这篇文章主要介绍了MySQL中事务隔离级别的实现原理,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2021-01-01
  • MySQL存储过程的传参和流程控制示例讲解

    MySQL存储过程的传参和流程控制示例讲解

    这篇文章主要介绍了MySQL存储过程的传参和流程控制示例讲解, repeat和Loop区别是repeat有自己退出循环的语句until,Loop使用的是if判断语句,本文结合示例代码详细讲解,需要的朋友可以参考下
    2023-02-02

最新评论