on duplicate key update用法

492 阅读1分钟

If you specify an ON DUPLICATE KEY UPDATE clause and a row to be inserted would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row occurs.

即MySQL会自动检查要插入的值是否跟表定义的主键或唯一索引有重复,如果没有,就会INSERT,如果有重复,则会更新。

假设存在表:

CREATE TABLE `mapping` (
  `id` int NOT NULL,
  `l1` varchar(10) DEFAULT NULL,
  `l2` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `l1` (`l1`,`l2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

以下2句sql的作用是一样。

INSERT INTO mapping VALUES(444,'a','b')
  ON DUPLICATE KEY UPDATE id = values(id);
  
update mapping set id = 444 where `id` = 444 or (`l1` = 'a' and `l2` = b); 

以下两句sql也是作用一样的:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
  

INSERT INTO t1 (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;

VALUES()函数会返回要插入记录的对应列的值。

In assignment value expressions in the ON DUPLICATE KEY UPDATE clause, you can use the VALUES(col_name) function to refer to column values from the INSERT portion of the INSERT ... ON DUPLICATE KEY UPDATE statement. In other words, VALUES(col_name) in the ON DUPLICATE KEY UPDATE clause refers to the value of col_name that would be inserted, had no duplicate-key conflict occurred.

总的来说,在有primary key或者unique索引重复值的情况下,ON DUPLICATE KEY UPDATE子句后面指定的列字段就是要更新的值。