3

主鍵的概念對SQL Server的數據庫引擎有什麼意義?我不是指在「ID」列上創建的聚簇/非聚簇索引,我的意思是約束對象「主鍵」。它存在與否有關係嗎?主鍵對Microsoft SQL Server 2008的含義

替代方案:

  1. ALTER TABLE添加主鍵聚集
  2. ALTER TABLE創建聚集索引

是否有所作爲?

回答

6

通常,KEY是一個列(或列的組合),用於唯一標識表中的每一行。表中可能有多個KEY(例如,您可能有一個Person表,其中社會安全號碼和自動遞增號碼都是密鑰)。

數據庫設計人員選擇這些KEY中的一個是PRIMARY KEY。從概念上講,哪個 KEY被選爲PRIMARY KEY並不重要。但是,由於PRIMARY KEY通常用於從其他表中引用此表中的條目(通過FOREIGN KEY),因此選擇一個好的PRIMARY KEY可能與w.r.t相關。 (一)性能和(b)可維護性

(a)由於主鍵通常將被用於連接,在主鍵的索引(其大小,其分佈,...)是性能要比其他指標更重要。 (b)由於主鍵被用作其他表中的外鍵,所以更改,主鍵值總是很麻煩,因爲其他表中的所有外鍵值也需要修改。

+0

事實上,我在這裏說的也適用於通過FOREIGN KEY引用的非空UNIQUE鍵。我不確定SQL Server是否會在UNIQUE和PRIMARY之間產生差異,爲什麼我剛剛開始了這個問題:http://stackoverflow.com/questions/2263119 – Heinzi 2010-02-14 22:42:27

+2

UNIQUE和PRIMARY KEY之間存在區別 - 你提到過你自己已經。在PRIMARY KEY中,列不能爲NULL。在一個唯一約束中,它們可能是NULL(在這種情況下,它不是一個標識符) – 2010-02-14 22:55:42

+0

@Roland:當然你是對的。我的意思是:「我不確定SQL Server是否能夠區分* NON-NULL * UNIQUE和PRIMARY,...」 – Heinzi 2010-02-14 23:06:08

4

PRIMARY KEY是一個約束 - 這是一個邏輯對象,它說明了您的數據必須遵守的規則。索引是一種訪問結構 - 它說明了機器可以通過數據搜索的方式。要實現PRIMARY KEY,大多數RDBMS-es使用索引。

有些RDBMS-es(例如MySQL)不區分PRIMARY KEY或UNIQUE約束和用於幫助實現它的索引。但是,例如,Oracle會:在oracle中,您可以執行如下操作:ALTER TABLE t DROP pk KEEP INDEX。如果您想要更改主鍵的定義(例如,您使用代理主鍵替換自然主鍵),但是您仍希望對原始主鍵列具有唯一約束而不重建索引,這非常有用。如果索引非常大並且需要大量表格和資源進行重建,那麼這很有意義。

從我所看到的,MS SQL沒有作出區分。我的意思是像Management Studio這樣的工具在不同的文件夾中顯示「Keys」,「Indexes」和「Constraints」,但改變其名稱會立即改變其他文件夾中相應對象的名稱。所以我認爲這裏的區別並不存在。