【问题标题】:Postgres UPSERT reuse column values from INSERT on UPDATEPostgres UPSERT 在更新时重用来自 INSERT 的列值
【发布时间】:2018-10-05 21:07:43
【问题描述】:
我有一个可以正常工作的基本 upsert 查询:
insert into table (id, data) values (1, '<data_string>')
on conflict (id) do update set data='<data_string>';
唯一的问题是我需要通过网络传输大量此类查询,所以我想知道是否有办法通过不在查询中两次列出 <data_string> 来将流量减少一半?
【问题讨论】:
标签:
sql
postgresql
query-optimization
upsert
【解决方案1】:
是的,有专门的表EXCLUDED用于目的:
INSERT INTO tbl (id, data)
VALUES (1, '<data_string>')
ON CONFLICT (id) DO UPDATE SET data = EXCLUDED.data;
点赞the manual explains:
请注意,特殊的excluded 表用于引用最初建议插入的值:
也适用于多行 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;