MySQL實現有記錄就忽略,沒記錄就插入以及有記錄就更新,沒記錄就插入

前提

MySQL版本 5.5.45,使用的引擎InnoDB.

準備數據表

現在我有張user表,看下錶結構:
在這裏插入圖片描述
主鍵是id,name是普通索引,mobile是唯一索引,其他是普通字段。

insert ignore

可以實現有記錄就忽略,無記錄就插入。有記錄和無記錄是以什麼爲判斷標準?爲了徹底搞清楚,我們可以做個實驗。
表裏面有這些數據:
在這裏插入圖片描述
當insert ignore的數據包含主鍵的時候,只要主鍵相同,就認爲記錄存在,插入會失敗,驗證如下:
在這裏插入圖片描述
當insert ignore的數據包含唯一索引的時候,只要唯一索引相同,就認爲記錄存在,插入會失敗,驗證如下:
在這裏插入圖片描述
在網上看到一種錯誤說法:當insert ignore的數據只包含普通字段或普通索引字段時,當這些字段都相同時,也會認爲記錄存在。這種說法是錯誤的!驗證如下:
爲了方便測試,將表結構更改如下:
在這裏插入圖片描述在這裏插入圖片描述

replace into

可以達到有記錄就更新,沒記錄就插入的效果。但實際上它是在有記錄時先刪除舊的記錄,然後再插入新的記錄。同樣,有記錄和無記錄的判斷標註是主鍵或唯一索引是否重複。
在這裏插入圖片描述
可以看到replace id爲11的記錄返回的受影響行數是2,因爲是先刪除舊的記錄,再插入新的記錄。
在這裏插入圖片描述
id爲26的記錄不存在,所以就直接插入了一條數據,受影響行數爲1.

insert … on duplicate key update

插入的行與表中現有記錄的惟一索引或主鍵中產生重複值,那麼就會發生舊行的更新;如果插入的行數據與現有表中記錄的唯一索引或者主鍵不重複,則執行新紀錄插入操作。另外,ON DUPLICATE KEY UPDATE不能寫where條件。
在這裏插入圖片描述可以看到,如果是更新,則返回的受影響行數是2.
在這裏插入圖片描述如果是新增記錄,返回的受影響行數是1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章