向MySQL插入数据有时会遇到主键重复的场景,原来的做法是先在程序代码中SELECT一下,判断是否存在指定主键或唯一键的数据,如果没有则插入,有的话则执行UPDATE操作,或另外一套逻辑,这种方法是不方便的。下面就介绍三种如何避免插入重复值的处理方法。

IGNORE

IGNORE的作用是插入的值遇到主键(PRIMERY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的数据,不影响后面数据的插入,即有则忽略,无则插入。,语法为:

INSERT IGNORE INTO ignore_tbl VALUES(1078,'MIKE');

简要介绍一下主键唯一键的区别:

1、当一个属性声明为主键时,它将不接受NULL值。另一方面,当声明为Unique的属性时,它可以接受一个NULL值。

2、表中只能有一个主键,但可以有多个唯一键。

3、定义主键时自动创建聚簇索引。相反,Unique键生成非聚集索引。

--创建表
create table ignore_tbl
(ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(10)
)DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.02 sec)--插入一条数据
INSERT INTO ignore_tbl (ID,NAME) VALUES(1078,'BOB');
Query OK, 1 row affected (0.01 sec)

正常情况下,插入主键(ID)相同的数据,会报错:

--正常插入重复主键的数据,会报错
INSERT INTO ignore_tbl (ID,NAME) VALUES(1078,'MIKE');
1062 - Duplicate entry '1078' for key 'PRIMARY'--数据也无法插入
SELECT * FROM ignore_tbl;
+------+------+
| ID   | NAME |
+------+------+
| 1078 | BOB  |
+------+------+
1 row in set (0.00 sec)

加入IGNORE后:


INSERT IGNORE INTO ignore_tbl VALUES(1078,'MIKE');
Query OK, 0 rows affected (0.00 sec)--没有插入数据,忽略了主键重复值的插入
SELECT * FROM ignore_tbl;
+------+------+
| ID   | NAME |
+------+------+
| 1078 | BOB  |
+------+------+
1 row in set (0.00 sec)

插入数据不重复时,则可以正常插入:

INSERT IGNORE INTO ignore_tbl VALUES(1079,'MIKE');
Query OK, 1 row affected (0.00 sec)SELECT * FROM ignore_tbl;
+------+------+
| ID   | NAME |
+------+------+
| 1078 | BOB  |
| 1079 | MIKE |
+------+------+
2 rows in set (0.00 sec)

REPLACE

该关键字的作用是当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入,即有则删除+插入,无则插入,语法为:

REPLACE INTO replace_tbl() VALUES();
--建表+插入数据
CREATE TABLE replace_tbl(
ID INT NOT NULL PRIMARY KEY,
NAME VARCHAR(10))
DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.01 sec)
--插入
INSERT INTO replace_tbl VALUES(1079,'mike');
Query OK, 1 row affected (0.00 sec)
--目前的数据
SELECT * FROM replace_tbl;
+------+------+
| ID   | NAME |
+------+------+
| 1079 | mike |
+------+------+
1 row in set (0.00 sec)

现在使用REPLACE操作:

--相当于先删除,又插入
REPLACE INTO replace_tbl VALUES(1079,'BOB');
Query OK, 2 rows affected (0.00 sec)--这时表中的数据
SELECT * FROM replace_tbl;
+------+------+
| ID   | NAME |
+------+------+
| 1079 | BOB  |
+------+------+
1 row in set (0.00 sec)

ON DUPLICATE KEY UPDATE

ON DUPLICATE KEY UPDATE 作用是当插入的记录遇到主键或者唯一键重复时,会执行后面定义的UPDATE操作。
相当于先执行Insert 操作,再根据主键或者唯一键执行update操作,即**有则更新,无则插入。**语法为:

INSERT INTO Tupdate() VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE NAME1=NAME1+1;
--建表
CREATE TABLE update_tbl(ID INT NOT NULL PRIMARY KEY,NAME VARCHAR(10))DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.01 sec)--插入数据
INSERT INTO update_tbl VALUES(1079,'MIKE');
Query OK, 1 row affected (0.00 sec)

使用ON DUPLICATE KEY UPDATE操作:

INSERT INTO update_tbl VALUES(1079,"MIKE") ON DUPLICATE KEY UPDATE NAME='BOB';
Query OK, 2 rows affected (0.00 sec)--表中的数据:
select * from update_tbl;
+------+------+
| ID   | NAME |
+------+------+
| 1079 | BOB  |
+------+------+
1 row in set (0.00 sec)

上面的操作相当于:

INSERT INTO update_tbl() VALUES(1079,"MIKE")
UPDATE update_tbl
SET NAME=’BOB‘
WHERE ID=1079;

如果插入不重复的数据则不去做更新操作:

INSERT INTO update_tbl VALUES(1080,"MIKE") ON DUPLICATE KEY UPDATE NAME='BOB';
Query OK, 1 row affected (0.00 sec)mysql> select * from update_tbl;
+------+------+
| ID   | NAME |
+------+------+
| 1079 | BOB  |
| 1080 | MIKE |
+------+------+
2 rows in set (0.00 sec)

再举一个例子:

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;
--相当于:
INSERT INTO Tupdate() VALUES(1,1)
UPDATE Tupdate
SET NAME1=2+1
WHERE ID=1;

也就是说,第二条记录(2,1)的1作为唯一键与第一条数据(1,1)的唯一键1重复了,因为(1,1)是先插入的,那么对它做更新操作(WHERE ID=1),取VALUES(ID)也就是2作+1操作NAME1=VALUES(ID)+1。总而言之,就是对已有数据进行更新操作,而不是新增数据。

参考文章:https://m.jb51.net/article/82441.htm

MySQL处理插入过程中主键或唯一键重复值的解决办法相关推荐

  1. springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法

    向MySQL插入数据有时会遇到主键重复的场景,原来的做法是先在程序代码中SELECT一下,判断是否存在指定主键或唯一键的数据,如果没有则插入,有的话则执行UPDATE操作,或另外一套逻辑,这种方法是不 ...

  2. mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法

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

  3. MySQL 处理插入重主键唯一键重复值办法

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

  4. mysql主键和唯一键的区别

    什么是主键? 主键是表中唯一标识该表中每个元组(行)的列.主键对表实施完整性约束.表中只允许使用一个主键.主键不接受任何重复值和空值.表中的主键值很少更改,因此在选择主键是需要小心,要选择很少发生更改 ...

  5. mysql唯一性和主键区别_Mysql主键和唯一键的区别点总结

    什么是主键? 主键是表中唯一标识该表中每个元组(行)的列.主键对表实施完整性约束.表中只允许使用一个主键.主键不接受任何重复值和空值.表中的主键值很少更改,因此在选择主键是需要小心,要选择很少发生更改 ...

  6. powerdesigner设置主键为自增字段,设置非主键为唯一键并作为表的外键

    转自:https://www.cnblogs.com/CoffeeHome/archive/2014/06/04/3767501.html 这里powerdesigner连接的数据库是以mysql为例 ...

  7. sql主键和唯一键和外键

    mysql数据库中对字段的约束里存在主键约束,也存在唯一键约束,这两种约束很容易出现混淆的情况,这里讲一下两个的区别: 主键和唯一键的对比: 约束 保证唯一性 是否为空 一个表中有多少个 是否允许组合 ...

  8. 主键、唯一键、外键、

    类型 保证唯一性 是否允许空 一个表中可以有多少个 是否允许组合 主键(primary key) 是 否 至多一个,可以为0 允许(不推荐,因为不稳定) 唯一(unique) 是 是 可以有多个 允许 ...

  9. ps安装程序检测到计算机重启过程,photoshop cs6安装过程中安装程序遇到错误:请重启计算机,解决办法...

    1.关闭防火墙和杀毒软件 2.删除注册表 依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager目录,找到其中的 ...

最新文章

  1. 数据库跟缓存的双写一致性
  2. 《Nature》挑战进化DNA突变理论!
  3. 【正一专栏】谁能阻止超神的曼城
  4. electron 样式不加载_electron-vue,启动之后没了样式和图片是什么原因呢,请大佬帮忙康康...
  5. ssl1500-最短路上的统计【Floyd】
  6. 演练 开心餐厅 0929
  7. 「SF图片上传不清晰」解决方案
  8. linux中date命令设置系统时间的方法-转
  9. CUDA初探—环境配置
  10. dongle 工具 蓝牙_CC2540 USB Dongle 蓝牙抓包分析仪使用教程
  11. 机器学习入门算法基础视频
  12. [置顶]       webservice系列1---基于web工程上写一个基本数据类型的webservice
  13. Cisco RV180W 路由器设置
  14. 【python 目标检测】基于深度学习的道路破损检测|yolov5|VOC
  15. iOS framework动态库重签名
  16. antdownload百度网盘下载器、下载不限速
  17. 如何才是一名优秀的好员工
  18. Mysql基础篇(2)—— 单行函数和聚合函数
  19. 从零开始学习大数据系列之Linux-02Vim与Shell script
  20. 加油吧,707!——立体几何篇

热门文章

  1. 3D视觉盛宴——SuperMap Realspace 立体显示技术
  2. PHP 打印支票,HTML_用Access2007解决支票打印的日期大写问题,财务人员都知道,转账支票的 - phpStudy...
  3. 第十七届全国大学生智能车竞赛华南赛区比赛成绩
  4. 恢复服务器上的安装器信息已被破坏_Garmin(佳明)或已支付赎金,但可能惹上新的麻烦...
  5. DeepFM、xDeepFM
  6. Elasticsearch:Reindex API 使用和故障排除的 3 个实践
  7. 实用的峰值检测电路实例与分析
  8. 水滴石穿 + 勤能补拙 = 2020
  9. 发那科工业机器人io板_一文背诵发那科机器人I/O板信号板及替换
  10. 低成本的单节锂电池充电芯片