1. 程式人生 > >mysql查詢是否存在某條記錄,不存在則插入,存在則更新

mysql查詢是否存在某條記錄,不存在則插入,存在則更新

在工作中,會遇到這樣的情形,查詢資料庫中是否存在一條記錄資訊,如果不存在則插入一條新的資訊,如果存在,則更新已有的資訊。

面對這樣的需求,之前採用的是先讀取一遍資料庫,判斷是否有資料,如果沒有則插入一條新資訊,如果有,則更新已有資訊,但是這種做法在高併發情況下可能存在多個執行緒查詢時都沒有資料,於是都往資料庫中插入新的記錄,在插入時則會丟擲異常(說該資訊已在資料庫中)。

後來發現,在Mysql的語法中其實提供了這麼一種操作,能夠完成這樣的任務。語法如下:
INSERT … ON DUPLICATE KEY UPDATE field1=value1, field2=value2,…, fieldn=valuesn;

這樣的語句在執行時作為一個原子操作執行,如果資料庫中沒有該條記錄,則插入,如果有,則更新這些欄位(field1=value1, field2=value2,…, fieldn=valuesn);需要說明的是,資料庫表必須含有一個唯一的索引,通過該索引來標記是否存在該條記錄。

以後如果遇到型別的需求,可以使用該語句,避免在程式中進行相應的邏輯判斷;另外提醒一下,後面的欄位賦值語句是用逗號“,”隔開哦,而不是用使用"and"邏輯連線詞,如“field1=value1 and field2=value2 and fieldn=valuesn“。

說明:

INSERT 語句的一部分,如果指定 ON DUPLICATE KEY UPDATE ,並且插入行後會導致在一個UNIQUE索引或PRIMARY KEY中出現重複值,則在出現重複值的行執行UPDATE,如果不會導致唯一值列重複的問題,則插入新行。如:

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

這兩條Sql語句的結果是相同的。

為甚說需要這種方式呢!這種方式不需要維護索引效率上比先刪除再插入要快的多。