MySQL 处理插入过程中的主键唯一键重复值的解决方法

 更新时间:2016年04月15日 09:26:27   投稿:mrr  
本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE的相关知识,感兴趣的朋友一起学习吧

本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE;接下来就分别看看这三种方式的处理办法。

IGNORE

使用ignore当插入的值遇到主键(PRIMARY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的记录行,不影响后面的记录行的插入,

创建测试表

CREATE TABLE Tignore
(ID INT NOT NULL PRIMARY KEY ,
NAME1 INT
)default charset=utf8; 

正常的插入如果插入的记录中存在键重复会报错,整个语句都会执行失败

使用IGNORE如果插入的记录中存在重复值会忽略重复值的该记录行,不影响其它行的插入。

REPLACE

使用replace当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入。

REPLACE INTO Treplace() VALUES(1,1),(1,2),(2,2); 

创建测试表

DROP TABLE IF EXISTS Treplace;
CREATE TABLE Treplace
(ID INT NOT NULL PRIMARY KEY ,
NAME1 INT
)default charset=utf8; 

从输出的信息可以看到是4行受影响,说明它是先插入了(1,1)然后又删除了(1,1)

ON DUPLICATE KEY UPDATE

当插入的记录遇到主键或者唯一键重复时,会执行后面定义的UPDATE操作。

相当于先执行Insert 操作,再根据主键或者唯一键执行update操作。

创建测试表

DROP TABLE IF EXISTS Tupdate;
CREATE TABLE Tupdate
(ID INT NOT NULL PRIMARY KEY ,
NAME1 INT UNIQUE KEY
)default charset=utf8; 
INSERT INTO Tupdate() VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE NAME1=NAME1+1;
INSERT INTO Tupdate() VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE NAME1=VALUES(NAME1)+1; 

第一条语句相当于执行:

INSERT INTO Tupdate() VALUES(1,1)
UPDATE Tupdate
SET NAME1=NAME1+1
WHERE ID=1; 

第二条语句相当于执行:

INSERT INTO Tupdate() VALUES(1,1)
UPDATE Tupdate
SET NAME1=2+1
WHERE ID=1; 

在ON DUPLICATE KEY UPDATE后面使用VALUES指的就是插入的记录的值,而不使用VALUES指的是表的自身值。

注意: ON DUPLICATE KEY UPDATE的后面执行的UPDATE更新的记录是WHERE重复的主键或者唯一键的ID,这点非常重要。

比如下面这种情况:

INSERT INTO Tupdate() VALUES(1,1),(2,1) ON DUPLICATE KEY UPDATE NAME1=VALUES(ID)+1; 

它是唯一键NAME1重复但是主键不重复,执行的语句是这样的:

INSERT INTO Tupdate() VALUES(1,1)
UPDATE Tupdate
SET NAME1=2+1
WHERE ID=1; 

不要认为会插入主键ID=2的记录进去。

总结

上面的三种处理重复值的方法都支持标准的INSERT语法,包括INSERT INTO...VALUES, INSERT INTO ....SET ,INSERT INTO..... SELECT。

关于MySQL 处理插入过程中的主键唯一键重复值的解决方法小编就给大家介绍这么多,希望对大家有所帮助!

相关文章

  • MySQL的触发器全解析(创建、查看触发器)

    MySQL的触发器全解析(创建、查看触发器)

    MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行,缺点是可读性差且维护难,注意外键约束可能影响触发器激活,下面跟随小编一起学习mysql的触发器知识,感兴趣的朋友一起看看吧
    2025-08-08
  • mysql之innodb的锁分类介绍

    mysql之innodb的锁分类介绍

    本文将介绍mysql之innodb的锁分类,需要了解更多的朋友可以参考下
    2012-11-11
  • MySQL中的交叉连接、自然连接和内连接查询详解

    MySQL中的交叉连接、自然连接和内连接查询详解

    这篇文章主要介绍了MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • 如何利用SSH隧道连接远程MySQL数据库

    如何利用SSH隧道连接远程MySQL数据库

    为保护MySQL数据库安全,可通过SSH隧道连接,服务端仅需开放SSH端口,加强密码策略,客户端可使用Navicat等工具,或通过编程(如SpringBoot)实现端口转发,推荐使用密钥建立SSH隧道,以免密码泄露风险,详述了端口转发的手动设置方法及自动化脚本配置
    2024-11-11
  • mysql清除log-bin日志的方法

    mysql清除log-bin日志的方法

    这篇文章主要介绍了mysql清除log-bin日志的方法,同时介绍了log-bin日志的作用,需要的朋友可以参考下
    2014-06-06
  • 使用MySQL的Binlog进行数据回滚的完整流程

    使用MySQL的Binlog进行数据回滚的完整流程

    本文描述了使用MySQL的binlog进行数据回滚的过程,从确认是否启用Binlog日志到找到误操作的记录,再到编写脚本解析记录,最后执行SQL语句实现回滚,需要的朋友可以参考下
    2025-12-12
  • 详解mysql 组合查询

    详解mysql 组合查询

    这篇文章主要介绍了详解mysql 组合查询的的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL8.0 如何快速加列

    MySQL8.0 如何快速加列

    这篇文章主要介绍了MySQL8.0 如何快速加列,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-09-09
  • MySQL提取Json内部字段转储为数字

    MySQL提取Json内部字段转储为数字

    本文主要介绍了MySQL提取Json内部字段转储为数字,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • 关于Mysql自增id的这些你可能还不知道

    关于Mysql自增id的这些你可能还不知道

    这篇文章主要给大家介绍了关于Mysql自增id的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05

最新评论