Postgresql

從postgres中的分區表返回ID?

  • February 8, 2014

當我插入一條記錄時,我需要返回插入的 id RETURNING。問題是表是分區的,在分區表中我不能使用RETURNING。我一次執行多個查詢,所以我急需RETURNING. 有沒有辦法做到這一點?

假設父母的表格是這樣的:

CREATE TABLE parent AS (
 id not null default nextval('parent_id_seq'::regclass)
 ... other columns ...
);

無論您是使用規則還是觸發器將 INSERT 轉移到子表中,在 INSERT 之後您可以立即使用:

SELECT currval('parent_id_seq'::regclass);

獲取id會話的最後一個插入,獨立於並發 INSERT,每個會話都有它自己獲得的最後一個序列值的副本。

如果不了解您目前如何管理分區表,則相對難以評估您可以採取哪些措施來規避此限制。假設您使用的是觸發器範例,為了RETURNING按預期工作,您必須將函式中的子句從RETURNto更改為,因為該子句永遠不會從前一種情況接收插入的值(因為它們實際上從未插入到主表)。進行此更改也會將插入的行傳遞到主表,從而允許子句接收結果。 BEFORE INSERT``NULL``NEW``RETURNING``RETURNING

但是,這意味著會發生雙重寫入,因此需要AFTER INSERT觸發函式來刪除重複的元素。雖然這顯然會產生額外的成本並有效地減半效率,但它的影響仍然小於RULE範式(無論如何可能需要同樣多的工作),當然在批量插入場景中除外。這是一致性和可維護性的性能權衡,但只要理解這一點並且首先使用分區表的好處是保持 SLA 的滿足,我認為這是一個可以接受的讓步。

這是完整的SQL Fiddle以顯示我在操作中所描述的內容。請注意,NewID()頂部的函式只是為了展示在沒有可用序列的情況下它是如何工作的,並且絕不暗示該函式本身在任何方面都是一個好主意(如果您願意,可以使用適當的全域 UID 外掛走那條路)。

引用自:https://dba.stackexchange.com/questions/58497