主鍵就是彙集索引嗎?

前言

  最近在一次面試中,討論了一個這樣的問題:主鍵和索引有什麼區別?當時個人回答是這樣的:「主鍵就是加了惟一性約束的彙集索引。」 「你肯定你所說的是對的?」 面試官反問到。 「應該是對的。」 我不加思索地回答道。 「你回去後研究一下這個問題吧。」面試

  難道我真的錯了?測試

第一次嘗試

  當問題出現時,請用事實支持你的觀點。spa

  首先,必須瞭解一些基本知識:對於一張表來講,彙集索引只能有一個,由於數據真實的物理存儲順序就是按照彙集索引存儲的。基於這個原理,如今能夠用這樣的方案來測試:對一張表設置一個主鍵, 以後再創建一個彙集索引,假如彙集索引能建立成功, 代表主鍵就不是彙集索引, 若是不能夠創建彙集索引,就代表主鍵是彙集索引。code

--創建一張TABLE 同時設置主鍵
CREATE TABLE student
(    
    stud_id  INT IDENTITY(1,1) NOT NULL,
    stud_name NVARCHAR(50) NOT NULL,    
    CONSTRAINT pk_student PRIMARY KEY(stud_id)    
);

  接下來就嘗試對這張表創建一個彙集索引吧。blog

CREATE CLUSTERED INDEX index_stud_name ON student(stud_name);

  執行這條語句的時候,SQLServer的消息框彈出了這樣的處理信息:「沒法對 表 'student' 建立多個彙集索引。請在建立新彙集索引前刪除現有的彙集索引 'pk_student'。"索引

  是否是我已經勝出了?class

進一步思考

  很大程度上,我應該對上述結果感到很滿意的。但謹慎的思惟提醒我:會不會本身遺漏了什麼東西?原理

  來看一下關於主鍵的定義吧,主鍵是表中的一個字段或多個字段,用來惟一地標識表中的一條記錄。惟一性是主鍵最主要的特性。在查閱創建主鍵的方法的時候, 一個以前被我徹底忽略的建立方式忽然出如今個人眼前, 在創建主鍵的時候能夠聲明爲CLUETERED(彙集)或NONCLUETERED(非彙集)!也就是說主鍵也能夠聲明爲非彙集索引,以下:方法

CREATE TABLE student
(
    stud_id INT IDENTITY(1,1) NOT NULL,
    stud_name NVARCHAR(20) NOT NULL,
    CONSTRAINT pk_student PRIMARY KEY NONCLUSTERED (stud_id)
);

  在SQLServer中,主鍵的建立必須依賴於索引,默認建立的是彙集索引,這就解釋了在上面的嘗試中爲何表中已創建了彙集索引。im

  可見,真的是我錯了。

後續

  園子裏的朋友提到一個觀點,就是跟着主鍵而建立的索引能夠被單獨刪除,經我測試過,這是不能夠的。

--執行刪除索引語句
DROP INDEX pk_student ON student

  SQLServer的消息框會彈出這樣的提示信息:」不容許對索引 'student.pk_student' 顯式地使用 DROP INDEX。該索引正用於 PRIMARY KEY 約束的強制執行。「

  若是對索引執行強制刪除的話,以下圖操做:

  

  結果是能夠刪除的,但主鍵也會被跟着一塊兒刪除,因此主鍵必須依賴於索引的觀點暫時是正確的。

相關文章
相關標籤/搜索