MySQL中ON DUPLICATE key update的使用
一、主鍵索引、唯一索引和普通索引的關(guān)系
主鍵索引:
在數(shù)據(jù)庫中定義一個主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當在查詢中使用主鍵索引時,它還允許快速訪問數(shù)據(jù)。主鍵索引不能為空。每個表只能有一個主鍵
唯一索引:
不允許兩行具有相同的索引值。但可以都為NULL。 如果現(xiàn)有數(shù)據(jù)中存在重復(fù)的鍵值,則數(shù)據(jù)庫不允許將新創(chuàng)建的唯一索引與表一起保存。當新數(shù)據(jù)和表中的鍵值重復(fù)時,數(shù)據(jù)庫會拒絕接受此數(shù)據(jù)。每個表可以有多個唯一索引
普通索引:
一般的索引結(jié)構(gòu),可以在條件刪選時加快查詢效率,索引字段的值可以重復(fù),可以為空值
二、實戰(zhàn)操作
1.ON DUPLICATE key update使用介紹:
有時候由于業(yè)務(wù)需求,可能需要先去根據(jù)某一字段值查詢數(shù)據(jù)庫中是否有記錄,有則更新,沒有則插入。這個時候就可以用到ON DUPLICATE key update這個sql語句了。
2.ON DUPLICATE key update測試樣例:
首先創(chuàng)一張簡單的表:

增加以下數(shù)據(jù):

數(shù)據(jù)包含主鍵(id):
insert into user (id,username,userpwd,num) values (1,"testName","testPwd",10) ON DUPLICATE KEY UPDATE username = VALUES(username), userpwd = VALUES(userpwd)

可以看到是根據(jù)主鍵來判斷,如果主鍵重復(fù)則執(zhí)行update。
加上username為唯一索引之后:

再次執(zhí)行
insert into user (id,username,userpwd,num) values (1,"testName2","testPwd2",10) ON DUPLICATE KEY UPDATE username = VALUES(username), userpwd = VALUES(userpwd)

可以看到還是根據(jù)id來進行判斷,如果主鍵重復(fù)則執(zhí)行update。
測試沒有id時:
insert into user (username,userpwd,num) values ("testName2","testPwd3",10)
ON DUPLICATE KEY UPDATE
username = VALUES(username),
userpwd = VALUES(userpwd)
可以看到,此時是根據(jù)唯一索引來進行判斷 ,如果唯一索引重復(fù)則執(zhí)行update。
說明優(yōu)先級:主鍵>唯一索引
此時測試沒有主鍵和唯一索引重復(fù)時的情況:
insert into user (username,userpwd,num) values ("testName4","testPwd4",10)
ON DUPLICATE KEY UPDATE
username = VALUES(username),
userpwd = VALUES(userpwd)
可以發(fā)現(xiàn),此時是新增一條數(shù)據(jù),說明如果主鍵和唯一索引都不重復(fù)的情況執(zhí)行insert。
三、總結(jié)
ON DUPLICATE key update是根據(jù)索引字段是否重復(fù)來判斷是否執(zhí)行,如果重復(fù)則執(zhí)行update,否則則執(zhí)行insert。
優(yōu)先級主鍵>唯一索引
- 當主鍵重復(fù)時則執(zhí)行update
- 當主鍵不重復(fù),唯一索引重復(fù)時也執(zhí)行update
- 當主鍵和唯一索引值都不重復(fù)才執(zhí)行insert
PS:特殊情況,當主鍵重復(fù)執(zhí)行update時,如果此時唯一索引字段與其他字段也重復(fù)則會報錯

到此這篇關(guān)于MySQL中ON DUPLICATE key update的使用的文章就介紹到這了,更多相關(guān)MySQL ON DUPLICATE key update內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysqld-nt: Out of memory (Needed 1677720 bytes)解決方法
這篇文章主要介紹了mysqld-nt: Out of memory (Needed 1677720 bytes)解決方法,需要的朋友可以參考下2014-12-12
使用MySQL的Explain執(zhí)行計劃的方法(SQL性能調(diào)優(yōu))
這篇文章主要介紹了使用MySQL的Explain執(zhí)行計劃的方法(SQL性能調(diào)優(yōu)),使用EXPLAIN關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL語句,具體詳解,需要的小伙伴可以參考一下2022-08-08
mysql數(shù)據(jù)庫如何轉(zhuǎn)移到oracle
這篇文章主要介紹了mysql數(shù)據(jù)庫如何轉(zhuǎn)移到oracle,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Mysql通過explain分析定位數(shù)據(jù)庫性能問題
這篇文章主要介紹了Mysql通過explain分析定位數(shù)據(jù)庫性能問題,明確SQL在Mysql中實際的執(zhí)行過程是怎樣的,如果查詢字段沒有索引則增加索引,如果有索引就要分析為什么沒有用到索引,本文詳細講解,需要的朋友可以參考下2023-01-01

