mysql 有就更新 沒有就插入
資料持久化的過程中,有時會遇到這樣的需求:
當資料庫表中存在符合某種條件的資料時,需要去更新它,不存在時,則需要新增,也就是insertOrUpdate操作,本文主要講解MySQL中的INSERT ... ON DUPLICATE KEY UPDATE語句,該語句是基於唯一索引或主鍵使用,比如一張表中含有a,b,c三個欄位,欄位a被加上了unique index,並且表中已經存在了一條a為1的一條記錄,我們假定是(1,1,1),那麼下面兩個語句的效果是相同的:
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;
(The effects are not identical for an InnoDB table where a is an auto-increment column. With an auto-increment column, an INSERT statement increases the auto-increment value but UPDATE does not.)
ON DUPLICATE KEY UPDATE後面可以放多個欄位,用英文逗號分割。使用ON DUPLICATE KEY UPDATE,最終如果插入了一個新行,則受影響的行數是1,如果修改了已存在的一行資料,則受影響的行數是2,如果值不變,則受影響行數是0。
如果欄位b也被加上了unique index,則該語句和下面的update語句是等效的:
UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2匹配了多行,則只有一行會被修改。通常情況下,在ON DUPLICATE KEY UPDATE語句中,我們應該避免多個唯一索引的情況。
在ON DUPLICATE KEY UPDATE子句的賦值表示式中,可以使用VALUES(欄位名)函式來表示即將插入的值,如果需要插入或更新多條資料,並且更新的欄位需要根據其它欄位來運算時,可以使用如下語句:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
上面的語句等同於下面兩條語句:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3;
INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9;
如果一個表中包含了一個自增的欄位,使用INSERT ... ON DUPLICATE KEY UPDATE新增或修改t資料後,可以通過last_insert_id()方法返回最後自動生成的值,如果是多條,實際測試是返回第一條資料自增的值。使用ON DUPLICATE KEY UPDATE時,將忽略DELAYED選項。
微信掃一掃,關注我的微信公眾號【Louis軍】,獲取更多及時更新。
如想交個朋友,可加微信:hunter2881(備註:部落格園)