Sql Postgres upsert:区分新行和更新行

Sql Postgres upsert:区分新行和更新行,sql,postgresql,upsert,Sql,Postgresql,Upsert,我正在考虑使用PostgreSQLINSERT。。关于冲突更新功能。理想情况下,我将能够区分哪些行已成功插入,哪些行已更新。有办法吗?您需要一个额外的辅助列来完成此操作(在示例中更新了) 为此,您需要一个附加的辅助列(updated) 有一种不向表中添加列的方法: CREATE TABLE tbl(id int PRIMARY KEY, col int); INSERT INTO tbl VALUES (1, 1); 插入tbl(id、col) 值(1,11)、(2,22) 在冲突(id)上执

我正在考虑使用PostgreSQL
INSERT。。关于冲突更新
功能。理想情况下,我将能够区分哪些行已成功插入,哪些行已更新。有办法吗?

您需要一个额外的辅助列来完成此操作(
在示例中更新了


为此,您需要一个附加的辅助列(
updated


有一种不向表中添加列的方法:

CREATE TABLE tbl(id int PRIMARY KEY, col int);
INSERT INTO tbl VALUES (1, 1);
插入tbl(id、col)
值(1,11)、(2,22)
在冲突(id)上执行更新
设置col=EXCLUDED.col
返回插入时的*,(xmax=0)
说明:


有一种方法可以不向表中添加列:

CREATE TABLE tbl(id int PRIMARY KEY, col int);
INSERT INTO tbl VALUES (1, 1);
插入tbl(id、col)
值(1,11)、(2,22)
在冲突(id)上执行更新
设置col=EXCLUDED.col
返回插入时的*,(xmax=0)
说明:


您需要一个额外的辅助列来完成此操作。使用此类功能,我看不出有什么方法可以获得此信息,正如Klin所说,您需要一个列来存储发生的操作,即使使用此列,您也需要另一件事来了解该特定操作(因为它可以同时发生多个操作)。我能看到的最好的方法是使用一个带有审计表的触发器。触发器将审核插入和更新,但即使使用触发器,您也需要一些东西来识别该操作,以区别于以前的操作。insert命令有一个
返回
子句,但我不知道它是否能够区分插入和更新。请看这里:您需要一个额外的辅助列来完成此操作。使用此类功能,我无法找到获得此信息的方法,正如Klin所说,您需要一个列来存储发生的操作,即使使用此列,您也需要另一件事来了解特定的操作(因为它可以同时发生多个操作)。我能看到的最好的方法是使用一个带有审计表的触发器。触发器将审核插入和更新,但即使使用触发器,您也需要一些东西来识别该操作,以区别于以前的操作。insert命令有一个
返回
子句,但我不知道它是否能够区分插入和更新。请看这里:他将如何将新更新的=true与以前的冲突(与其他插入/更新)区分开来?这就是为什么我没有提供这样的答案。没有必要区分新旧冲突,因为您从
返回的结果*
总是最新的。嗯,我没有想到这一点。感谢您提供的信息。他如何将新更新的=true与以前的冲突(与其他插入/更新)区分开来?这就是为什么我没有提供这样的答案。没有必要区分新旧冲突,因为您从
返回的结果*
总是最新的。嗯,我没有想到这一点。谢谢你的信息。
INSERT INTO tbl(id, col)
VALUES (1,11), (2,22)
ON     CONFLICT (id) DO UPDATE
SET    col = EXCLUDED.col
RETURNING *, (xmax = 0) AS inserted;