插入. . 关于多个项目的重复密钥更新

我想做这样的事

INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value')
ON DUPLICATE KEY UPDATE
t.c = 'value';
INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = 'value2';

T.A 和 T.B 是关键。这一切工作正常,但是我在第二次插入时得到一个错误。对于 phpMyAdmin,像这样的查询工作得很好,但是我猜测它是独立运行查询的,因为它把查询的结果打印成注释?

这样的东西将是好太多,但我需要有不同的价值为每个项目。我更喜欢这样,但我不知道如何更改每个值的更新值。

INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = ???

问题是在问号中,我应该在那里放什么,以便每次插入/更新都有正确的值?显然,如果我把一个值放在那里,所有的字段都会得到这个值。

如果有另一种方法来做一个“更新如果存在,否则插入”查询多个字段与两个键,我也为其他想法。我想我可以分别运行每个查询(比如 phpMyAdmin?)但是会有很多疑问,所以我想尽量避免。

70182 次浏览

使用 VALUES ()函数

INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c)

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

声明太低,无法评论,但我想添加一个稍微复杂一点的语法,这是受到@u 响应的启发。更新重复键上的多个字段:

INSERT INTO t (t.a, t.b, t.c, t.d)
VALUES ('key1','key2','value','valueb'), ('key1','key3','value2','value2b')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c),
t.d = VALUES(t.d)

希望可以帮助有人在那里希望执行批量插入与多重密钥更新。我不知道这句话的语法。

在 MySQL 8.0.19之后,您可以使用 as关键字,例如:

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

或者

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

档号: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html