Mysql批量插入數(shù)據(jù)時(shí)如何解決重復(fù)問(wèn)題?
基本用法:on dupdate key update 語(yǔ)句基本功能是:當(dāng)表中沒(méi)有原來(lái)記錄時(shí),就插入,有的話就更新。
1,on duplicate key update 語(yǔ)句根據(jù)主鍵id或唯一鍵來(lái)判斷當(dāng)前插入是否已存在。
2,記錄已存在時(shí),只會(huì)更新on duplicate key update之后指定的字段。
3,如果同時(shí)傳遞了主鍵和唯一鍵,以主鍵為判斷存在依據(jù),唯一鍵字段內(nèi)容可以被修改。
4,特殊用法:參考第五、第六條。
一、構(gòu)造測(cè)試數(shù)據(jù)
注意里面的唯一鍵
#創(chuàng)建表
drop table if exists tbl_test;
create table tbl_test(
id int primary key auto_increment,
name varchar(30) unique not null,
age int comment '年齡',
address varchar(50) comment '住址',
update_time datetime default current_timestamp on update current_timestamp
) comment '測(cè)試表';
#插入語(yǔ)句 來(lái)源【碼農(nóng)編程進(jìn)階筆記】
insert into tbl_test(name,age,address) values('huahua',20,'京華市'),('caocao',21,'京海市');
效果如下:

二、sql用法介紹
on dupdate key update 語(yǔ)句基本功能是:當(dāng)表中沒(méi)有原來(lái)記錄時(shí),就插入,有的話就更新。
如下sql:
insert into tbl_test(id,name,age,address) values(1,'huahua1',201,'京華市1')
on duplicate key update
age = values(age),
address = values(address);
從執(zhí)行結(jié)果可以看出,更新了id為1的age,address兩個(gè)字段,而name字段沒(méi)有修改生效。由此我們可以得出兩個(gè)重要結(jié)論:
on duplicate key update 語(yǔ)句根據(jù)主鍵id來(lái)判斷當(dāng)前插入是否已存在。
已存在時(shí),只會(huì)更新on duplicate key update之后限定的字段。
三,sql用法介紹2
如下sql:
insert into tbl_test(name,age,address) values('huahua',202,'京華市2')
on duplicate key update
age = values(age),
address = values(address);

從執(zhí)行結(jié)果看,這次沒(méi)有傳id,但是age,address字段仍然更新了。
由此可以得出另一個(gè)結(jié)論:
3. on duplicate key update 語(yǔ)句也可以根據(jù)唯一鍵來(lái)判斷當(dāng)前插入的記錄是否已存在。
三、sql用法介紹
如下sql:
insert into tbl_test(name,age,address) values('huahua2',202,'京華市2')
on duplicate key update
age = values(age),
address = values(address);
這條執(zhí)行就比較簡(jiǎn)單了,沒(méi)有主鍵或唯一鍵字段值相同,即判斷當(dāng)前記錄不存在,新插入一條。
四、sql用法介紹
如下sql:
insert into tbl_test(id,name,age,address) values(1,'huahua1',202,'京華市2')
on duplicate key update
name = values(name),
age = values(age),
address = values(address);

從上面可以看出,連唯一鍵name也被修改了。結(jié)論:
4.如果傳遞了主鍵,是可以修改唯一鍵字段內(nèi)容的。
這里要注意,如果這里的name修改為 caocao,huahua2
會(huì)報(bào)唯一鍵沖突的。可以自行嘗試。
五,on dupdate key update之后沒(méi)有用values的情況
分為兩種情況:
1,如果為如上面的name = "abc",則會(huì)一直更新為"abc".
2,如果為如上面的name = name ,則name會(huì)保持?jǐn)?shù)據(jù)庫(kù)中的值,不會(huì)更新。
六,對(duì)values使用判斷
如下sql
#來(lái)源公眾號(hào):【碼農(nóng)編程進(jìn)階筆記】
insert into tbl_test(id,name,age,address) values(1,'huahua1',202,'京華市2')
on duplicate key update
name = ifnull(values(name),name),
age = values(age);
達(dá)到的效果是,如果傳入的name值為null,則不更新。不為null則更新。這里與mybatis配合使用比較好。
