有没有一种简单的方法可以INSERT
在一行不存在时使用,或者UPDATE
如果它存在,使用一个 MySQL 查询?
问问题
61760 次
2 回答
197
使用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
于 2009-08-02T13:35:22.460 回答
7
我知道这是一个老问题,但谷歌最近把我带到了这里,所以我想其他人也会来这里。
@chaos 是正确的:有INSERT ... ON DUPLICATE KEY UPDATE
语法。
但是,原始问题专门询问了 MySQL,并且在 MySQL 中有REPLACE INTO ...
语法。恕我直言,这个命令更容易和更直接地用于 upserts。从手册:
REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。
请注意,这不是标准 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
与 Sqlite 的行为非常相似INSERT OR REPLACE INTO
。如果您只想在记录已存在的情况下更新几列(而不是所有列),请参阅此问题以了解一些解决方法。
于 2017-05-21T15:49:28.340 回答