2010-03-25 100 views
1

有沒有辦法讓2個序列在Postgres中同步?Postgresql:保持2個序列同步

我的意思是,如果我有:

table_A_id_seq = 1 
table_B_id_seq = 1 

如果我執行SELECT nextval('table_A_id_seq'::regclass)

我想這table_B_id_seq需要的table_A_id_seq

相同的值,顯然它必須是在另一側相同。

我需要2個不同的序列,因爲我必須破解我在Django中的一些約束(並且我無法在那裏解決)。

+0

當你寫你的序列時,是否有可能有一個序列值=其他,m,反之亦然? – 2010-03-25 17:19:56

回答

1

這兩個表格必須以某種方式相關?我會將該關係封裝在包含序列的查找表中,然後用期望使用查找表的視圖替換您希望處理的兩個表。

0

您可以在Table_A上放置一個INSERT觸發器,該觸發器執行一些代碼以增加Table_B的序列。現在,每當您在Table_A中插入新行時,它都會觸發該觸發器。

+0

不起作用,序列不是事務安全的。如果一個查詢失敗,則會更新一個序列,另一個可能不會。你不能用觸發器做到這一點。 – 2010-03-25 21:24:39

0

我首先想到的是,爲什麼你真的想這樣做?這味道有點溺愛,有點像牛奶在幾天過期後就會出現。

什麼情況下需要這兩個seq保持相同的價值?

忽略「這似乎有點奇怪」的感受我得到我的胃,你可以試試這個:

放在表-A觸發,這是否在插入。 - 將b seq設置爲a的值。

select setval('table_b_seq',currval('table_a_seq')); 

這種方法的問題是假設只有插入到表-A將改變table_a_seq值,沒有別的將遞增table_a_seq。如果你能忍受這一點,這可能會以一種非常冒險的方式工作,如果這是我的電話,我就不會發布它。

如果你真的需要這個,爲了使它更健壯,使一個單一的接口增加table_a_seq,比如一個函數。並且只允許通過這個函數對table_a_seq進行操作。這樣就有一個接口來增加table_a_seq,你也應該把 select setval('table_b_seq',currval('table_a_seq'));放到那個函數中。這樣,無論如何,table_b_seq將始終設置爲等於table_a_seq。這意味着將用戶的任何授權移除到table_a_seq,並且僅授予他們執行新功能的授予權限。

0

對兩個表使用一個序列。除非您始終將它們重複同步,否則無法保持同步。序列不是事務安全的,它們總是向前滾動,從不向後,甚至沒有ROLLBACK。

編輯:一個序列也不起作用,不會給你兩個表的相同數字。使用子查詢獲取正確的數字,併爲單個表使用單個序列。另一個表必須使用子查詢。