前提
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.