從postgres中的分區表返回ID?
當我插入一條記錄時,我需要返回插入的 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
按預期工作,您必須將函式中的子句從RETURN
to更改為,因為該子句永遠不會從前一種情況接收插入的值(因為它們實際上從未插入到主表)。進行此更改也會將插入的行傳遞到主表,從而允許子句接收結果。BEFORE INSERT``NULL``NEW``RETURNING``RETURNING
但是,這意味著會發生雙重寫入,因此需要
AFTER INSERT
觸發函式來刪除重複的元素。雖然這顯然會產生額外的成本並有效地減半效率,但它的影響仍然小於RULE
範式(無論如何可能需要同樣多的工作),當然在批量插入場景中除外。這是一致性和可維護性的性能權衡,但只要理解這一點並且首先使用分區表的好處是保持 SLA 的滿足,我認為這是一個可以接受的讓步。這是完整的SQL Fiddle以顯示我在操作中所描述的內容。請注意,
NewID()
頂部的函式只是為了展示在沒有可用序列的情況下它是如何工作的,並且絕不暗示該函式本身在任何方面都是一個好主意(如果您願意,可以使用適當的全域 UID 外掛走那條路)。