Java小强个人技术博客站点    手机版
当前位置: 首页 >> DB >> MySQL批量插入,如何判断重复

MySQL批量插入,如何判断重复

14520 DB | 2023-2-10

需要把其他库或者Excel中的数据批量导入到指定库中,业务中需要判断是否为重复数据,但是大量数据录入时判断是否重复,如何实现?


创建测试表

CREATE TABLE `test` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`name`  varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=COMPACT;

insert ignore into

插入时检索主键列表,如存在相同主键记录,不更改原纪录,只插入新的记录。
ignore关键字所修饰的SQL语句执行后,在遇到主键冲突时会返回一个0,代表并没有插入此条数据。如果主键是由后台生成的(如uuid),我们可以通过判断这个返回值是否为0来判断主键是否有冲突,从而重新生成新的主键key。
这种方法很简便,但是有一种可能,就是插入不是因为重复数据报错,而是因为其他原因报错的,也同样被忽略
示例:

[SQL] INSERT IGNORE INTO test (id,name) VALUES (1,'java小强');
受影响的行: 1
时间: 0.030s
[SQL]INSERT IGNORE INTO test (id,name) VALUES (1,'java小强博客');
受影响的行: 0
时间: 0.030s

replace into

插入时如发现主键已存在,则替换原记录,即先删除原记录,后insert新记录。

[SQL] REPLACE  INTO test (id,name) VALUES (1,'java小强博客');
受影响的行: 2
时间: 0.030s

on duplicate key update

注意,该语法为Mysql特有语法
当primary或者unique重复时,则执行update语句,如update后为无用语句,如id=id,则同1功能相同,但错误不会被忽略掉

[SQL] INSERT INTO test (id,name) VALUES (1,'java小强博客更新') ON DUPLICATE KEY UPDATE name='java小强博客更新';
受影响的行: 2
时间: 0.030s
当插入多条数据,其中不只有表中已存在的,还有需要新插入的数据,MySQL会智能的选择更新还是插入。
[SQL] INSERT INTO test (id,name) VALUES (1,'java小强博客更新'),(2,'java技术博客') ON DUPLICATE KEY UPDATE name='java小强2023';
受影响的行: 3
时间: 0.030s

insert … select … where not exist

根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。

[SQL] INSERT INTO test (id,name) SELECT 1,'java小强TJ' FROM test WHERE NOT EXISTS (SELECT id,name FROM test WHERE id=1);
受影响的行: 0
时间: 0.029s
[SQL] INSERT INTO test (id,name) SELECT 2,'java小强TJ' FROM test WHERE NOT EXISTS (SELECT id,name FROM test WHERE id=2);
受影响的行: 1
时间: 0.030s

这种方法其实就是使用了mysql的一个临时表的方式,但是里面使用到了子查询,效率会有一点点影响。


推荐您阅读更多有关于“ mysql ignore 重复 批量插入 ”的文章

上一篇:MySQL 中datetime和timestamp 下一篇:MySQL的sql_mode模式说明

猜你喜欢

发表评论: