2010-06-21 104 views
0

我有一個關於postgresql序列的問題。關於postgresql序列的問題

例如,對於bigserial數據類型,序列是否爲高級,然後檢索數字,即使插入/提交不成功,序列也不會回溯。這意味着下一次我可能會插入表中,這可能是序列號中的一個缺口。

Theres a before insert row trigger on my table and Im using psycopg2。

在此先感謝。

回答

4

即使插入/承諾是 不成功,序列不 回溯。這意味着下一次我可能會插入表中,這可能是序列號中的一個缺口。

是的,那是真的,那很好。 一個人通常想要一個序列來獲取唯一表格中的值(通常是PK) 並且根本沒有差距。

如果您好奇:如果您考慮併發性,這是自然的行爲。假設事務T1插入一行,從序列中獲取PK1,使用該值在其他表中創建另一個記錄......同時(在T1提交之前),另一個事務T2在同一個表中插入一行。然後T1回滾和T2提交...

順便說一句:如果你想要一個「無間隙」的序列......首先問自己,如果你真的想要這樣做(通常你真的不需要 - 並要求經常指向你的設計中的一個概念性問題)......但如果你確實需要它,你可以閱讀this

+2

繼續上面:你真的不應該擔心代理鍵中的「空白」。這樣做(根據我的經驗)表明代理不夠不透明。就序列而言,保證單調遞增(除非重置),所以... – 2010-06-21 03:26:52

+1

即使它增加也應該是多餘的 – 2010-06-21 03:32:40

+0

沒錯,我知道了。感謝您的解釋。 – goh 2010-06-21 03:50:24

3

回溯將需要鎖定,直到完成。這會很糟糕,尤其是當10個表格都可以使用相同的順序時。如果您想要訂單,請不要使用序號,請使用類似row_number()的窗口功能。

+0

感謝您的幫助。 – goh 2010-06-21 03:51:39