需要把其他库或者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