MySQL ON DUPLICATE KEY UPDATE的用法
阿新 • • 發佈:2019-01-02
如果在INSERT
語句末尾使用ON DUPLICATE KEY UPDATE
,此時mysql
會檢查插入行的主鍵和唯一索引是否存在重複的值,如果存在重複值的行執行UPDATE
,否則插入新行。
注意:mysql
會優先校驗非null
欄位,然後才會執行ON DUPLICATE KEY UPDATE
,如果校驗不通過,那麼丟擲異常
注意:如果表同時存在主鍵、唯一索引、聯合唯一索引的一個或多個時,只要其中的一個發生衝突,則更新值
注意:非sql
標準
CREATE TABLE `union_index` ( `id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, UNIQUE KEY `union_index` (`id`,`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 當唯一性的列發生衝突,那麼更新age的值 INSERT INTO union_index ( id, NAME, age ) VALUES ( 1, "p7+", 1 ) ON DUPLICATE KEY UPDATE age = 2; -- 批量插入,ON DUPLICATE KEY UPDATE 後面使用 value/values 都可以,但是用mybatis時,建議使用values,values裡的是列名 INSERT INTO union_index ( id, NAME, age ) VALUES ( 1, "p7+", 1) , ( 2, "p8+", 2 ) ON DUPLICATE KEY UPDATE name = VALUES(NAME) , age = VALUES(age);
ON DUPLICATE KEY UPDATE
引發的問題
innoDB
的ON DUPLICATE KEY UPDATE
可能會引發死鎖,下面是mysql
官網上的bug
資訊。因此,使用語法時,儘量避免表中有多個唯一索引,並且儘量不要併發插入相同的資料。
An INSERT ... ON DUPLICATE KEY UPDATE statement against a table having more than one unique or primary key is also marked as unsafe