PostgreSQL:Return 从 COPY FROM 插入自动生成的 ID

PostgreSQL: Return auto-generated ids from COPY FROM insertion

我有一个非空的 PostgreSQL table,其中有一个 GENERATED ALWAYS AS IDENTITYid。我使用 C++ 绑定 pqxx::stream_to 进行批量插入,我假设它使用 COPY FROM。我的问题是我想知道新创建的行的 ids,但是 COPY FROM 没有 RETURNING 子句。我看到了几种可能的解决方案,但我不确定其中哪一个是好的,或者哪个是最不坏的:

我认为这是一种常见情况,但我没有看到明显正确的解决方案。你推荐什么?

您可以使用 system columns 找出当前交易影响了哪些行。 xmin 列包含插入事务的 ID,因此要 return 您刚刚复制的 id 值,您可以:

BEGIN;

COPY foo(col1,col2) FROM STDIN;

SELECT id FROM foo
WHERE xmin::text = (txid_current() % (2^32)::bigint)::text
ORDER BY id;

COMMIT;

WHERE 子句来自 this answer,解释了其背后的原因。

我认为没有任何方法可以使用索引对其进行优化,因此在大型 table 上它可能太慢了。如果是这样,我认为您的第二个选择是要走的路,即流入临时 table 和 INSERT ... RETURNING.