系列文章目录
文章目录
- 系列文章目录
- 前言
前言
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
需要把其他库或者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的一个临时表的方式,但是里面使用到了子查询,效率会有一点点影响。