MySQL中ON DUPLICATE key update的使用
一、主鍵索引、唯一索引和普通索引的關(guān)系
主鍵索引:
在數(shù)據(jù)庫中定義一個主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的。當(dāng)在查詢中使用主鍵索引時,它還允許快速訪問數(shù)據(jù)。主鍵索引不能為空。每個表只能有一個主鍵
唯一索引:
不允許兩行具有相同的索引值。但可以都為NULL。 如果現(xiàn)有數(shù)據(jù)中存在重復(fù)的鍵值,則數(shù)據(jù)庫不允許將新創(chuàng)建的唯一索引與表一起保存。當(dāng)新數(shù)據(jù)和表中的鍵值重復(fù)時,數(shù)據(jù)庫會拒絕接受此數(shù)據(jù)。每個表可以有多個唯一索引
普通索引:
一般的索引結(jié)構(gòu),可以在條件刪選時加快查詢效率,索引字段的值可以重復(fù),可以為空值
二、實(shí)戰(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來進(jìn)行判斷,如果主鍵重復(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ù)唯一索引來進(jìn)行判斷 ,如果唯一索引重復(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)先級主鍵>唯一索引
- 當(dāng)主鍵重復(fù)時則執(zhí)行update
- 當(dāng)主鍵不重復(fù),唯一索引重復(fù)時也執(zhí)行update
- 當(dāng)主鍵和唯一索引值都不重復(fù)才執(zhí)行insert
PS:特殊情況,當(dāng)主鍵重復(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_multi在Linux服務(wù)器上運(yùn)行多個MySQL實(shí)例
在Linux系統(tǒng)上使用mysqld_multi來啟動和管理多個MySQL實(shí)例是一種常見的做法,這種方式允許你在同一臺機(jī)器上運(yùn)行多個MySQL服務(wù),每個服務(wù)可以有不同的配置和數(shù)據(jù)目錄,這篇文章展示如何設(shè)置和使用mysqld_multi來啟動多個MySQL實(shí)例2025-02-02關(guān)于Mysql update修改多個字段and的語法問題詳析
這篇文章主要給大家介紹了關(guān)于mysql update修改多個字段and的語法問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12圖解Mysql中的LEFT?JOIN、RIGHT?JOIN與JOIN的區(qū)別
這篇文章主要介紹了圖解Mysql中的LEFT?JOIN、RIGHT?JOIN與JOIN的區(qū)別,Left?Join就是以左邊為基準(zhǔn),Inner?Join就是查兩個重復(fù)的部分,Right?Join就是以右邊為基準(zhǔn),需要的朋友可以參考下2023-11-11Mysql數(shù)據(jù)庫慢查詢常用優(yōu)化方式
數(shù)據(jù)庫SQL優(yōu)化是老生常談的問題,下面這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫慢查詢常用優(yōu)化方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05