使用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列?
答案 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;
conflict_action
(...)ON CONFLICT DO UPDATE中的SET和WHERE子句可以使用表的名称(或别名)访问现有行,并使用特殊
excluded
表访问建议插入的行。