PostgreSQL:Return 从 COPY FROM 插入自动生成的 ID
PostgreSQL: Return auto-generated ids from COPY FROM insertion
我有一个非空的 PostgreSQL table,其中有一个 GENERATED ALWAYS AS IDENTITY
列 id
。我使用 C++ 绑定 pqxx::stream_to 进行批量插入,我假设它使用 COPY FROM
。我的问题是我想知道新创建的行的 id
s,但是 COPY FROM
没有 RETURNING
子句。我看到了几种可能的解决方案,但我不确定其中哪一个是好的,或者哪个是最不坏的:
通过COPY FROM
手动提供id
s,注意给出标识序列本应提供的值,然后将序列与[=20=同步].
首先将数据流式传输到带有自定义索引列的临时table进行排序。然后做一些像
INSERT INTO foo (col1, col2)
SELECT ttFoo.col1, ttFoo.col2 FROM ttFoo
ORDER BY ttFoo.idx RETURNING foo.id
并取决于身份序列产生升序数字以将它们与 ttFoo.idx
相关联这一事实(我也不能做 RETURNING ttFoo.idx
因为只有插入的行可用于不包含 idx
的行)
在插入之前查询标识序列的当前值,然后检查哪些行是新的。
我认为这是一种常见情况,但我没有看到明显正确的解决方案。你推荐什么?
您可以使用 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
.
我有一个非空的 PostgreSQL table,其中有一个 GENERATED ALWAYS AS IDENTITY
列 id
。我使用 C++ 绑定 pqxx::stream_to 进行批量插入,我假设它使用 COPY FROM
。我的问题是我想知道新创建的行的 id
s,但是 COPY FROM
没有 RETURNING
子句。我看到了几种可能的解决方案,但我不确定其中哪一个是好的,或者哪个是最不坏的:
通过
COPY FROM
手动提供id
s,注意给出标识序列本应提供的值,然后将序列与[=20=同步].首先将数据流式传输到带有自定义索引列的临时table进行排序。然后做一些像
并取决于身份序列产生升序数字以将它们与INSERT INTO foo (col1, col2) SELECT ttFoo.col1, ttFoo.col2 FROM ttFoo ORDER BY ttFoo.idx RETURNING foo.id
ttFoo.idx
相关联这一事实(我也不能做RETURNING ttFoo.idx
因为只有插入的行可用于不包含idx
的行)在插入之前查询标识序列的当前值,然后检查哪些行是新的。
我认为这是一种常见情况,但我没有看到明显正确的解决方案。你推荐什么?
您可以使用 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
.