Postgres UPSERT 在 UPDATE 时重用 INSERT 中的列值

Postgres UPSERT reuse column values from INSERT on UPDATE

我有一个工作正常的基本更新插入查询:

insert into table (id, data) values (1, '<data_string>') 
    on conflict (id) do update set data='<data_string>';

唯一的问题是我需要通过网络发送大量此类查询,所以我想知道是否有办法通过不在查询中列出两次 <data_string> 来将流量减半?

是的,有特殊的tableEXCLUDED的目的:

INSERT INTO tbl (id, data)
VALUES (1, '<data_string>') 
ON CONFLICT (id) DO UPDATE SET data = <b>EXCLUDED.</b>data;

喜欢the manual explains

Note that the special excluded table is used to reference values originally proposed for insertion:

也适用于多行 INSERT:

INSERT INTO tbl (id, data)
VALUES (1, '<data_string1>') 
     , (2, '<data_string2>') 
     , (3, '<data_string3>') 
ON CONFLICT (id) DO UPDATE
SET data = EXCLUDED.data;