Mysql ON DUPLICATE KEY UPDATE 用法

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

例如,如果列 a 爲 主鍵 或 擁有UNIQUE索引,並且包含值1,則以下兩個語句具有相同的效果:

INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;

如果行作爲新記錄被插入,則受影響行的值顯示1;如果原有的記錄被更新,則受影響行的值顯示2。
這個語法還可以這樣用:
如果INSERT多行記錄(假設 a 爲主鍵或 a 是一個 UNIQUE索引列):

INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1;

執行後, c 的值會變爲 4 (第二條與第一條重複, c 在原值上+1).

INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c);

執行後, c 的值會變爲 7 (第二條與第一條重複, c 在直接取重複的值7).
注意:ON DUPLICATE KEY UPDATE只是MySQL的特有語法,並不是SQL標準語法!
這個語法和適合用在需要 判斷記錄是否存在,不存在則插入存在則更新的場景.

示例如下:

mysql> show create table testB\G;
*************************** 1. row ***************************
       Table: testB
Create Table: CREATE TABLE `testB` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8 NOT NULL,
  `aid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_aid` (`aid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.03 sec)

ERROR: 
No query specified

mysql> select * from testB;
+----+------+-----+
| id | name | aid |
+----+------+-----+
|  1 | b_1  |   2 |
|  3 | b_2  |   3 |
+----+------+-----+
2 rows in set (0.02 sec)

mysql> insert into testB(name, aid) values('b_3',3) on duplicate key update aid = aid+1;
Query OK, 2 rows affected (0.04 sec)

mysql> select * from testB;
+----+------+-----+
| id | name | aid |
+----+------+-----+
|  1 | b_1  |   2 |
|  3 | b_2  |   4 |
+----+------+-----+
2 rows in set (0.00 sec)

mysql> insert into testB(name, aid) values('b_3',3);
Query OK, 1 row affected (0.04 sec)

mysql> select * from testB;
+----+------+-----+
| id | name | aid |
+----+------+-----+
|  1 | b_1  |   2 |
|  3 | b_2  |   4 |
|  5 | b_3  |   3 |
+----+------+-----+
3 rows in set (0.00 sec)

所以使用ON DUPLICATE KEY UPDATE帶來的一個弊端是會造成自增鍵值的浪費。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章