需要把其他库或者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;
插入时检索主键列表,如存在相同主键记录,不更改原纪录,只插入新的记录。
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
插入时如发现主键已存在,则替换原记录,即先删除原记录,后insert新记录。
[SQL] REPLACE INTO test (id,name) VALUES (1,'java小强博客'); 受影响的行: 2 时间: 0.030s
注意,该语法为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
根据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的一个临时表的方式,但是里面使用到了子查询,效率会有一点点影响。
Java小强
未曾清贫难成人,不经打击老天真。
自古英雄出炼狱,从来富贵入凡尘。
发表评论: