例如,如果列 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帶來的一個弊端是會造成自增鍵值的浪費。