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定时任务(EVENT事件)如何配置详解

    MySQL定时任务(EVENT事件)如何配置详解

    这篇文章主要介绍了MySQL定时任务(EVENT事件)如何配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Mysql临时表原理及创建方法解析

    Mysql临时表原理及创建方法解析

    这篇文章主要介绍了Mysql临时表原理及创建方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Windows环境下重置mysql密码操作命令

    Windows环境下重置mysql密码操作命令

    Windows XP系统、xampp集成环境如何重置mysql密码,接下来为大家详细介绍下,感兴趣的各位可以参考下哈,希望可以帮助到你们
    2013-03-03
  • 优化mysql之key_buffer_size设置

    优化mysql之key_buffer_size设置

    这篇文章主要介绍了优化mysql之key_buffer_size设置的相关资料,需要的朋友可以参考下
    2016-05-05
  • MySQL SQL语句优化的10条建议

    MySQL SQL语句优化的10条建议

    这篇文章主要介绍了MySQL中SQL语句优化需要注意的10点,,特别是大型高并发网站,需要的朋友可以参考下
    2014-03-03
  • 关于SQL建表语句使用详解

    关于SQL建表语句使用详解

    在SQL数据库设计中,创建表是基本操作,涉及定义表结构,包括列名、数据类型和约束等,本文详细介绍建表语句,通过示例帮助理解,常见数据类型包括整数、浮点数、字符串、日期时间等,约束确保数据完整性,包括主键、唯一、非空、默认值、外键和检查约束
    2024-10-10
  • mysql 按照时间段来获取数据的方法

    mysql 按照时间段来获取数据的方法

    mysql 按照时间段来获取数据的方法,需要的朋友可以参考一下
    2013-03-03
  • Mysql中的DCL权限详解

    Mysql中的DCL权限详解

    这篇文章主要介绍了Mysql中的DCL详解,DCL是数据控制语言,用来管理用户、控制数据库的访问权限,就控制有哪些用户可以访问数据库,可以访问数据库的哪些内容,需要的朋友可以参考下
    2023-08-08
  • mysql获取版本的几种方法实现

    mysql获取版本的几种方法实现

    本文主要介绍了mysql获取版本的方法实现,主要介绍了三种方法,包含SELECT VERSION(),SHOW VARIABLES和命令行,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • MySQL存储过程中实现执行动态SQL语句的方法

    MySQL存储过程中实现执行动态SQL语句的方法

    这篇文章主要介绍了MySQL存储过程中实现执行动态SQL语句的方法,实例分析了MySQL中构造及执行动态SQL语句的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论