![](/img/trans.png)
[英]Getting auto-generated key from row insertion in spring 3 / PostgreSQL 8.4.9
[英]PostgreSQL: Return auto-generated ids from COPY FROM insertion
我有一個帶有GENERATED ALWAYS AS IDENTITY
列id
的非空 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.