一,構造測試數據
注意里面的唯一鍵
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,參考第五。