簡體   English   中英

PostgreSQL:從 COPY FROM 插入返回自動生成的 ID

[英]PostgreSQL: Return auto-generated ids from COPY FROM insertion

我有一個帶有GENERATED ALWAYS AS IDENTITYid的非空 PostgreSQL 表。 我使用 C++ 綁定 pqxx::stream_to 進行批量插入,我假設它使用COPY FROM 我的問題是我想知道新創建的行的id ,但是COPY FROM沒有RETURNING子句。 我看到了幾種可能的解決方案,但我不確定其中任何一個是好的,或者哪個是最不壞的:

  • 通過COPY FROM手動提供id ,注意給出標識序列本應提供的值,然后將序列與setval(...)同步。

  • 首先將數據流式傳輸到帶有用於排序的自定義索引列的臨時表。 然后做類似的事情

    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的行)

  • 在插入之前查詢標識序列的當前值,然后檢查哪些行是新的。

我認為這是一種常見情況,但我沒有看到明顯正確的解決方案。 您有什么推薦的嗎?

您可以使用系統列找出哪些行受到當前交易的影響。 xmin列包含插入事務的 ID,因此要返回剛剛復制的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子句來自這個答案,它解釋了背后的原因。

我不認為有任何方法可以用索引優化它,所以在大表上它可能太慢了。 如果是這樣,我認為您的第二個選擇是要走的路,即流入臨時表並INSERT... RETURNING

我認為您可以創建類型為 uuid 的 id。

第一步,您應該在批量插入它們之后隨機分配您的 ID,這樣您就不需要從數據庫返回 ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM