Tag: ignore

MySQL: On Duplicate Key Update Do Nothing

Posted by – May 10, 2013

在 MySQL 資料庫中 Insert 資料時常會有些例外情況需要處理,像是碰到 UNIQUE 鍵值重複時,如果不處理就會出現錯誤。

最近碰到一個需求是如果 UNIQUE 值重複時... 就什麼也不做。

有兩種解法,INSERT IGNORE 和 REPLACE。不過各自有缺點,前者是忽略錯誤訊息,但仍有可能出現警告,尤其是當以下情況發生時:

  • 插入值遇到 PRIMARY KEY 或 UNIQUE 重複。
  • 在 NOT NULL 欄位插入空值。

而 REPLACE 實際上在碰到重複值的行為是先 DELETEINSERT,顯而易見的問題是 auto-increment ID 會變動.... 外來鍵馬上掛掉。而且多一步 DELETE 對效率有負面影響。

第三種解法是 ON DUPLICATE KEY UPDATE,當值重複時觸發一個 UPDATE 行為。

INSERT INTO table_tags 
   SET tag = 'tag' 
    ON DUPLICATE KEY UPDATE tag = tag;

碰到重複鍵時結果是

Query OK, 0 rows affected (0.07 sec)

什麼也沒做,讚啦。

雖然什麼事都沒做,不過流程上需要 insert id 去跑下一步.... 理論上沒有實際進行 INSERT 行為就沒有 insert id,不過還好一樣可以趁著觸發 UPDATE 的時候做個手腳。將上句改為...

INSERT INTO table_tags 
   SET tag = 'tag' 
    ON DUPLICATE KEY UPDATE tag = tag,
                            tag_id = LAST_INSERT_ID(tag_id);

就可以取得 insert id,碰到重複值也能取得現有資料的 id。