2009-07-29 52 views
0

是否有其他策略可用於自動遞增主鍵?所以,而不是通常的x + n,其中n是1,n可能是其他數字,如5?或者可能是一個隨機數字,但下一個ID仍然是唯一的?除了默認的x + 1之外,還有其他策略可用於自動遞增主鍵嗎?

我不確定它的用途是什麼,或者即使它是個好主意,我只是好奇而已。

+1

隨機數字不會太好,因爲主鍵應該是唯一的! – 2009-07-29 16:25:42

+0

從技術上講,「自動增量」只能是x + n(在這種情況下n通常是1)。推測你的意思是產生下一個ID的策略。 – Draemon 2009-07-29 16:33:10

回答

2

在T-SQL(MS SQL Server)的使用IDENTITY property

IDENTITY [(種子,增加

種子是的值用於加載到表中的第一行。

增量是添加到加載的上一行的標識值的增量值。「

有一件事你真的不應該做的是嘗試推出自己的,除非你真的知道你在做什麼,並能處理併發等

編輯:爲什麼你需要小心:

下面是一些僞SQL顯示使用自己的增量等方面的危險:

1. @NextID = SELECT MAX(ID) FROM MyTable; 

2. INSERT INTO MyTable(ID + 1, Name) VALUES (@NextID, "Dan"); 

現在,在大多數情況下,這會工作確定。但是,在高容量數據庫中,在步驟1和步驟2之間可能會出現另一個插入語句。然後,您最終會遇到主鍵違例和錯誤。它可能不會經常發生,但是當它發生時,確定是一種痛苦。

解決此問題的方法是在步驟1之前有一個LOCK並在步驟2之後釋放它。這有效地排隊所有事務,數據庫以「單用戶」模式運行。在高音量系統中,這可能對性能非常不利。

這就是爲什麼所有主流數據庫都有自動遞增主鍵的序列或內置方法。

0

取決於您正在使用的RDBMS。在甲骨文會是這樣(只要你設置觸發了主鍵):

SQL> create sequence fun_seq 
    start with 8 
    increment by 2; 
1

在MySQL的主 - 主複製的情況下,它有不同的服務器具有完全獨立的自動遞增是很重要的,以避免碰撞。

通過爲每個服務器指定偏移量和增量來保持鍵的分離。例如,

auto_increment_increment= 2 
auto_increment_offset = 2 
1

我們還爲主/主複製情況使用不同的增量方案。我認爲我們有一臺服務器正在計數,另一臺正在倒計時。偶/奇也是完全有效的。

0

對於隨機標識符(以及可以在服務器間唯一標識的標識符),可以使用GUID字段而不是int字段。這些都有他們自己的問題和問題,你應該在做這樣的設計之前仔細閱讀它們。

相關問題