几个月前,我从Stack Overflow的答案中学到了如何使用以下语法在MySQL中一次执行多个更新:
INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z)
ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2);
Run Code Online (Sandbox Code Playgroud)
我现在切换到PostgreSQL,显然这是不正确的.它指的是所有正确的表,所以我认为这是使用不同关键字的问题,但我不确定PostgreSQL文档中的哪个被覆盖.
为了澄清,我想插入几个东西,如果它们已经存在则更新它们.
我得到了一个典型的例子:
INSERT INTO user_logins (username, logins)
VALUES ('Naomi',1),('James',1)
ON CONFLICT (username)
DO UPDATE SET logins = user_logins.logins + EXCLUDED.logins;
Run Code Online (Sandbox Code Playgroud)
但现在我还需要知道:
我有一张桌子
CREATE TABLE foo
(
f0 int,
time_stamp timestamp,
CONSTRAINT foo_pk PRIMARY KEY (f0)
)
Run Code Online (Sandbox Code Playgroud)
我需要大量写入此表,因此性能是关键.有时,我会写一个具有现有值的记录,f0并且只会更新time_stamp到当前时间.为此,我使用了一个ON CONFLICT..DO UPDATE条款.
问题是我需要知道是否INSERT已经发生或是UPDATE.
我虽然使用第二is_update列.插入,插入false和
`ON CONFLICT .. DO UPDATE set is_update=true`
Run Code Online (Sandbox Code Playgroud)
然后RETURNING is_update用来得到我想要的东西.问题在于引入了与数据本身无关的附加列.