在ON CONFLICT中将行列从一个表复制到另一个表

时间:2017-06-04 21:26:33

标签: sql postgresql unique upsert

使用Postgres 9.6,我将一行(选定列)从一个表复制到另一个表。我正在跑步:

INSERT INTO copy_on_write(id, images)
    SELECT id, images
    FROM listings
    WHERE id = 1 AND posted_by = foo
ON CONFLICT (id) DO UPDATE SET images = listings.images 

因为ID已经存在而发生冲突,我收到了missing FROM-clause entry for table "listings"

所以,我试过了:

INSERT INTO copy_on_write(id, images)
    SELECT id, images
    FROM listings
    WHERE id = 1 AND posted_by = foo
ON CONFLICT (id) DO UPDATE SET images = images FROM listings

然后我得到syntax error at or near "FROM"

如何处理此ON CONFLICT (id),以便在行ID已存在时更新images列?

1 个答案:

答案 0 :(得分:4)

使用excluded

INSERT INTO copy_on_write(id, images) 
SELECT id, images 
FROM listings 
WHERE id = 1 AND posted_by = 'foo' 
ON CONFLICT (id) DO UPDATE SET images = excluded.images;

来自the documentation:

  

conflict_action

     

(...)ON CONFLICT DO UPDATE中的SET和WHERE子句可以使用表的名称(或别名)访问现有行,并使用特殊excluded表访问建议插入的行。