2012-04-14 75 views
1

生成表的主鍵時最好的方法是什麼?主鍵生成的方法

也就是說,當數據庫接收的數據不是內射的並且不能用作主鍵時。

在代碼中,管理錶行主鍵的最佳方法是什麼?

謝謝。

+0

對不起,但我不明白'內射'。你什麼意思? – Steve 2012-04-14 10:38:15

+0

「內射函數是一種保持獨特性的函數」# – nothrow 2012-04-14 11:08:57

回答

2

首先建議遠離唯一標識符躲避的主​​鍵。雖然它有一些有趣的簡單方法來生成它的客戶端,但它使幾乎不可能對主鍵有任何意義可能是有用的。如果我能夠及時回去並且禁止99%使用過的地方使用獨特識別標誌,那麼在過去的2年裏這將節省3人以上的dba /開發時間。

這是我推薦的,使用INT IDENTITY作爲主鍵。

create table YourTableName(
    pkID int not null identity primary key, 
    ... the rest of the columns declared next. 
) 

其中pkID是您的主鍵列的名稱。

這應該做你正在尋找。

+0

有趣。你能否延續你的建議,並解釋爲什麼你的經驗與uniqueidentifiers是如此糟糕。爲什麼你不能有任何有用的索引?那是因爲字體大小和索引大小? – huhu78 2012-04-14 21:30:49

+0

在索引中使用uniqueidentifiers,因爲沒有自然的排序順序,所以效率非常低。基於索引的b-tree結構,當使用uniqueidentifiers時,最終會產生極其分散的索引。重建或重組後,它們仍然非常分散。所以你最終會得到一個較慢的索引,由於存在碎片,最終會導致在內存和磁盤上非常龐大。同樣,在插入uniqueidentifier時,您更可能最終在索引上進行頁面拆分,從而減慢插入速度。通常,uniqueidentifiers對於索引是個壞消息。 – 2012-04-14 22:05:26

+0

好點。我會記得的。我認爲妥協可能是將uniqueidentifier作爲主鍵,並構建CLUSTERED索引,包括不唯一但在uniqueidentifier列前排序數據列。然後你在表格/頁面中有「物理」和有用的數據順序。 – huhu78 2012-04-15 11:07:52

2

AUTO_INCREMENT在MySQL,IDENTITY在SQL Server ..

1

在SQL Server IDENTITY

,如果你需要得到了解你的新ID是什麼,而INSERT -ing數據,使用INSERT聲明OUTPUT條款 - 所以新行的副本放在table-type參數中。

如果由於某些原因在SQL中生成唯一ID不適合您,請在您的應用程序中生成GUID - GUID具有非常高的獨特性(但實際上並不能保證)。 SQL Server具有專用的GUID類型 - 它被稱爲uniqueidentifier

http://msdn.microsoft.com/en-us/library/ms187942.aspx