添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

需要把其他库或者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 重复 批量插入 ”的文章

  • 2-10 常用SpringJPA主键生成策略,UUID和自增
  • 2-10 Apache Commons Jar包下载
  • 2-10 IIS服务器返回Bad Request (Invalid Hostname)解决办法
  • 2-10 SpringJPA 慎重 findAll() 切记分页
  • Apache Commons Jar包下载
  • IIS服务器返回Bad Request (Invalid Hostname)解决办法
  • SpringJPA 慎重 findAll() 切记分页
  • java中BigDecimal加减乘除基本用法
  • Byte和Bit之间的转换
  • java中用Eclipse打JAR包,包含外部JAR
  • 分布式任务调度平台XXL-JOB:调度日志打印时区问题
  • SpringBoot中application.yml引入多个YML文件
  • 多线程同步计数器CountDownLatch,CyclicBarrier,Semaphore
  • 并发编程之AtomicInteger,AtomicLong,LongAdder
  • 并发编程之Java中Selector
  • 并发编程BlockingQueue、BlockingDeque
  •