UPDATE时INSERT中的Postgres UPSERT重用列值

时间:2018-10-05 21:07:44

标签: sql postgresql query-optimization upsert

我有一个基本的Upsert查询,可以正常运行:

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

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

1 个答案:

答案 0 :(得分:2)

是的,有一个特殊的表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;
相关问题