Mysql批量插入数据时如何解决重复问题?

举报
lxw1844912514 发表于 2022/06/12 23:15:10 2022/06/12
【摘要】 基本用法:on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。 1,on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。 2,记录已存在时,只会更新on duplicate key update之后指定的字段。 3,如果同时传递...

基本用法:on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。

1,on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。

2,记录已存在时,只会更新on duplicate key update之后指定的字段。

3,如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。

4,特殊用法:参考第五、第六条。

一、构造测试数据

注意里面的唯一键


   
  1. #创建表
  2. drop table if exists tbl_test;
  3. create table tbl_test(
  4. id int primary key auto_increment,
  5. name varchar(30) unique not null,
  6. age int comment '年龄',
  7. address varchar(50) comment '住址',
  8. update_time datetime default current_timestamp on update current_timestamp
  9. ) comment '测试表';
  10. #插入语句 来源【码农编程进阶笔记】
  11. insert into tbl_test(name,age,address) values('huahua',20,'京华市'),('caocao',21,'京海市');

效果如下:

ed0dc55e886461bb9a49fcbc4945f84b.png

二、sql用法介绍

on dupdate key update 语句基本功能是:当表中没有原来记录时,就插入,有的话就更新。

如下sql:


   
  1. insert into tbl_test(id,name,age,address) values(1,'huahua1',201,'京华市1')
  2. on duplicate key update
  3. age = values(age),
  4. address = values(address);

e4b78ae09bcd12e8af5066b3c522c48e.png

从执行结果可以看出,更新了id为1的age,address两个字段,而name字段没有修改生效。由此我们可以得出两个重要结论:

  1. on duplicate key update 语句根据主键id来判断当前插入是否已存在。

  2. 已存在时,只会更新on duplicate key update之后限定的字段。

三,sql用法介绍2

如下sql:


   
  1. insert into tbl_test(name,age,address) values('huahua',202,'京华市2')
  2. on duplicate key update
  3. age = values(age),
  4. address = values(address);

c5364cf0792b5170c290a7c20c1650cb.png

从执行结果看,这次没有传id,但是age,address字段仍然更新了。

由此可以得出另一个结论:

3. on duplicate key update 语句也可以根据唯一键来判断当前插入的记录是否已存在。

三、sql用法介绍

如下sql:


   
  1. insert into tbl_test(name,age,address) values('huahua2',202,'京华市2')
  2. on duplicate key update
  3. age = values(age),
  4. address = values(address);

09225265afaa9446584c9ab8f883566d.png

这条执行就比较简单了,没有主键或唯一键字段值相同,即判断当前记录不存在,新插入一条。

四、sql用法介绍

如下sql:


   
  1. insert into tbl_test(id,name,age,address) values(1,'huahua1',202,'京华市2')
  2. on duplicate key update
  3. name = values(name),
  4. age = values(age),
  5. address = values(address);

d106e1f4fd87b032e21119785751db69.png

从上面可以看出,连唯一键name也被修改了。结论:

4.如果传递了主键,是可以修改唯一键字段内容的。

这里要注意,如果这里的name修改为 caocao,huahua2

会报唯一键冲突的。可以自行尝试。

五,on dupdate key update之后没有用values的情况

分为两种情况:

1,如果为如上面的name = "abc",则会一直更新为"abc".

2,如果为如上面的name = name ,则name会保持数据库中的值,不会更新。

六,对values使用判断

如下sql


   
  1. #来源公众号:【码农编程进阶笔记】
  2. insert into tbl_test(id,name,age,address) values(1,'huahua1',202,'京华市2')
  3. on duplicate key update
  4. name = ifnull(values(name),name),
  5. age = values(age);

达到的效果是,如果传入的name值为null,则不更新。不为null则更新。这里与mybatis配合使用比较好。

d3db67a83253f0cb1958180c800f0577.png

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/125240966

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。