文章目录
本文内容仅在 MariaDB-10.2.15 版本下验证,其它环境下可能略有差异。
当数据库中存量数据较多时,或者是在批量插入操作时,很容易出现插入重复数据的问题。
一、三种方法
在 mysql 中,当存在主键冲突或唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法:
insert ignore into
:若没有则插入,若存在则忽略
replace into
:若没有则正常插入,若存在则先删除后插入
insert into ... on duplicate key update
:若没有则正常插入,若存在则更新
注意,使用以上方法的前提是表中有一个 PRIMARY KEY
或 UNIQUE
约束/索引,否则,使用以上三个语句没有特殊意义,与使用单纯的 INSERT INTO
效果相同。
在具体介绍三种方法的使用方式之前,均使用如下语句初始化表数据:
"-- 创建表 ljtest --"
CREATE TABLE IF NOT EXISTS ljtest (
id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, -- 自增主键 id
emp_no INT(11) NOT NULL,
title VARCHAR(50) NOT NULL,
from_date DATE NOT NULL,
to_date DATE DEFAULT NULL)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
"-- 插入三条数据 --"
INSERT INTO ljtest VALUES
('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
"-- 查看表数据 --"
select * from ljtest;
+----+--------+-----------------+------------+------------+
| id | emp_no | title | from_date | to_date |
+----+--------+-----------------+------------+------------+
| 1 | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
| 2 | 10002 | Staff | 1996-08-03 | 9999-01-01 |
| 3 | 10003 | Senior Engineer | 1995-12-03 | 9999-01-01 |
+----+----