MySQL的on duplicate key update 使用說明與總結


一,構造測試數據

注意里面的唯一鍵

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 '測試表';

insert into tbl_test(name,age,address) values('huahua',20,'京華市'),('caocao',21,'京海市');

效果如下:

二,sql用法介紹1
on dupdate key update 語句基本功能是:當表中沒有原來記錄時,就插入,有的話就更新。

如下sql:
insert into tbl_test(id,name,age,address) values(1,'huahua1',201,'京華市1')
on duplicate key update
age = values(age),
address = values(address);

從執行結果可以看出,更新了id為1的age,address兩個字段,而name字段沒有修改生效。由此我們可以得出兩個重要結論:
1,on duplicate key update 語句根據主鍵id來判斷當前插入是否已存在。
2,已存在時,只會更新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);

從執行結果看,這次沒有傳id,但是age,address字段仍然更新了。
由此可以得出另一個結論:
3,on duplicate key update 語句也可以根據唯一鍵來判斷當前插入的記錄是否已存在。

三,sql用法介紹3
如下sql:
insert into tbl_test(name,age,address) values('huahua2',202,'京華市2')
on duplicate key update
age = values(age),
address = values(address);

這條執行就比較簡單了,沒有主鍵或唯一鍵字段值相同,即判斷當前記錄不存在,新插入一條。

四,sql用法介紹4
如下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也被修改了。結論:
4,如果傳遞了主鍵,是可以修改唯一鍵字段內容的。
這里要注意,如果這里的name修改為 caocao,huahua2
會報唯一鍵沖突的。可以自行嘗試。

五,on dupdate key update之后沒有用values的情況
分為兩種情況:
1,如果為如上面的name = "abc",則會一直更新為"abc".
2,如果為如上面的name = name ,則name會保持數據庫中的值,不會更新。

六,總結
基本用法:on dupdate key update 語句基本功能是:當表中沒有原來記錄時,就插入,有的話就更新。

1,on duplicate key update 語句根據主鍵id或唯一鍵來判斷當前插入是否已存在。
2,記錄已存在時,只會更新on duplicate key update之后指定的字段。
3,如果同時傳遞了主鍵和唯一鍵,以主鍵為判斷存在依據,唯一鍵字段內容可以被修改。
4,特殊用法:,on dupdate key update之后沒有用values,參考第五。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM