導讀:很多時候我們在做數據插入的時候需要判斷一下當前我插入的數據是否已經存在於數據庫中。
一般情況下我們會寫兩條sql去操作
select 查詢當前插入的數據是否已經存在如果不存在就插入新的記錄,如果存在就提示用戶該記錄已經存在在mysql里面可以這么操作,如果記錄存在就跳過或者更新,不存在就插入!
IGNORE
這個是根據插入表的主鍵和唯一索引去匹配的,如果當前插入的記錄存在則跳過不插入。
示例:
INSERT IGNORE INTO `user` ('phone') VALUES ('18888888888');
此時user表中phone字段是唯一的,如果有這條記錄則不執行插入操作,如果出現重復數據,將不返回錯誤,只是以警告形式返回。
on duplicate key update
主鍵或者唯一索引有重復時,則執行update操作
示例:
假設有一張表,id為主鍵,並且表中已經存在了id=1,likes=5的記錄,此時下面兩條sql等價。
INSERT INTO TABLENAME (id,likes) VALUES (1,18) ON DUPLICATE KEY UPDATE likes=likes+1;
UPDATE TABLENAME SET likes=likes+1 WHERE id=1;
如果是插入值,返回受影響行數為1,如果執行了更新操作那么返回的受影響行數為2.

如果條件是針對於主鍵操作的,那么此操作是無效操作,等同於ignore

如果一次性插入多條記錄,此時id為主鍵,或者a是一個unique索引,並且表中已經存在id=1,likes=3的記錄。
INSERT INTO TABLENAME (id,likes) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE likes = likes+1;
執行后likes的值為變成5,因為在插入前已經存在了id=1的記錄,上面的sql等於執行了兩條update語句。

NOTE:INSERT INTO TABLENAME……ON DUPLICATE KEY UPDATE……,這樣的sql中,假如插入的記錄在表中一種有重復值(與主鍵、唯一索引匹配),那么則會執行update操作,如果在插入的時候表中沒有重復值,那么就會執行insert操作。
問題:現在問題來了,如果INSERT多行記錄, ON DUPLICATE KEY UPDATE后面字段的值怎么指定?要知道一條INSERT語句中只能有一個ON DUPLICATE KEY UPDATE,到底他會更新一行記錄,還是更新所有需要更新的行。這個問題困擾了我很久了,其實使用VALUES()函數一切問題都解決了。
如果表中已經有id=1,likes=18 ;id=2,likes=19的兩條記錄,如果插入語句中有id=1或者id=2的記錄,則更新原有記錄,否則插入新行。

最后強調一下:
注意:ON DUPLICATE KEY UPDATE只是MySQL的特有語法,並不是SQL標准語法!
INSERT……SELECT……WHERE NOT EXISTS
NOTE:根據查詢條件判斷是否已經有對應的值,有的話跳過,沒有的話執行插入,隨便想查什么就查什么,這個用得最多。

REPLACE INTO
如果存與主鍵或者唯一索引相同的記錄,那么則會先刪除,然后在插入新記錄。

注意:如果有兩個主鍵或者唯一索引,必須要值全部匹配才會執行替換操作,否則執行插入操作,詳情見官網。
MySQL對REPLACE(和 LOAD DATA ... REPLACE)使用以下算法 :
嘗試將新行插入表中插入失敗,因為主鍵或唯一索引發生重復鍵錯誤:從表中刪除具有重復鍵值的沖突行再次嘗試將新行插入表中