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

dma*_*man 4 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 
Run Code Online (Sandbox Code Playgroud)

由于 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
Run Code Online (Sandbox Code Playgroud)

但后来我得到syntax error at or near "FROM"

ON CONFLICT (id)如果行 ID 已经存在,我该如何处理这个问题,以便它更新图像列?

kli*_*lin 5

使用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;
Run Code Online (Sandbox Code Playgroud)

文档中:

冲突动作

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