我如何更新,如果存在,插入如果不(又名"更新插入"或"合并")在MySQL?

StackOverflow https://stackoverflow.com/questions/1218905

是有一个简单的方法来 INSERT 一个行当它不存在,或 UPDATE 如果存在,使用一个MySQL查询?

有帮助吗?

解决方案

是, INSERT ... ON DUPLICATE KEY UPDATE 。例如:

INSERT INTO `usage`
(`thing_id`, `times_used`, `first_time_used`)
VALUES
(4815162342, 1, NOW())
ON DUPLICATE KEY UPDATE
`times_used` = `times_used` + 1

其他提示

我知道这是一个老问题,但是谷歌引导我最近在这里所以我想其他人也在这里。

@混乱是正确的:还有就是 INSERT ... ON DUPLICATE KEY UPDATE 语法。

但是,原来的问题要求有关MySQL具体地说,在MySQL有 REPLACE INTO ... 语法。恕我直言,这个命令是比较容易和更加直接用于upserts.从手册:

替代工作完全像插入除外,如果一个古老的排在该表具有同样的价值作为一个新的行为的一个主要关键或一个独特的指标,旧行被删除之前,新的行插入。

注意这不是标准SQL。一个例子手册:

CREATE TABLE test (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  data VARCHAR(64) DEFAULT NULL,
  ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

编辑: 只是一个公正的警告 REPLACE INTO 是不是喜欢 UPDATE.作为该手册说, REPLACE 删除该行如果存在,然后插入一个新。(注意的有趣"2影响的行"在上面的例子。) 也就是说,它将替代的价值 所有 列的现有记录(而不仅仅是更新 一些 列。) 该行为的MySQL REPLACE INTO 是很像源码的 INSERT OR REPLACE INTO.看看 这个问题 对于某些解决方法,如果你只想要更新的几个列(而不是所有列)如果该记录已经存在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top