什么是主鍵?
在數(shù)據(jù)庫中,常常不只是一個(gè)表,這些表之間也不是相互獨(dú)立的。不同的表之間需要建立一種關(guān)系,才能將它們的數(shù)據(jù)相互溝通。而在這個(gè)溝通過程中,就需要表中有一個(gè)字段作為標(biāo)志,不同的記錄對(duì)應(yīng)的字段取值不能相同,也不能是空白的。通過這個(gè)字段中不同的值可以區(qū)別各條記錄。就像我們區(qū)別不同的人,每個(gè)人都有名字,但它卻不能作為主鍵,因?yàn)槿嗣苋菀壮霈F(xiàn)重復(fù),而身份證號(hào)是每個(gè)人都不同的,所以可以根據(jù)它來區(qū)別不同的人。數(shù)據(jù)庫的表中作為主鍵的字段就要像人的身份證號(hào)一樣,必須是每個(gè)記錄的值都不同,這樣才能根據(jù)主鍵的值來確定不同的記錄。
如果為表指定了 PRIMARY KEY 約束,則 SQL Server 2005 數(shù)據(jù)庫引擎 將通過為主鍵列創(chuàng)建唯一索引來強(qiáng)制數(shù)據(jù)的唯一性。當(dāng)在查詢中使用主鍵時(shí),此索引還可用來對(duì)數(shù)據(jù)進(jìn)行快速訪問。因此,所選的主鍵必須遵守創(chuàng)建唯一索引的規(guī)則。?
創(chuàng)建主鍵時(shí),數(shù)據(jù)庫引擎 會(huì)自動(dòng)創(chuàng)建唯一的索引來強(qiáng)制實(shí)施 PRIMARY KEY 約束的唯一性要求。如果表中不存在聚集索引或未顯式指定非聚集索引,則將創(chuàng)建唯一的聚集索引以強(qiáng)制實(shí)施 PRIMARY KEY 約束。
唯一性約束
1) 唯一性約束所在的列允許空值,但是主鍵約束所在的列不允許空值。
(2) 可以把唯一性約束放在一個(gè)或者多個(gè)列上,這些列或列的組合必須有唯一的只。但是,唯一性約束所在的列并不是表的主鍵列。
(3) 唯一性約束強(qiáng)制在指定的列上創(chuàng)建一個(gè)唯一性索引。在默認(rèn)情況下,創(chuàng)建唯一性的非聚簇索引,但是,也可以指定所創(chuàng)建的索引是聚簇索引。
主鍵:?
1) 用于標(biāo)識(shí)某行而且與之相關(guān).
2) 是不可能(或很難)更新.
3) 不應(yīng)該允許空(NULL).
唯一域/字段:
1) 用于作為訪問某行的可選手段.
2) 只要唯一就可以更新.
3) 可以為空(NULLs).
注意唯一和主鍵的區(qū)別,它們都是創(chuàng)建一個(gè)唯一的索引,一個(gè)表格僅含有一個(gè)主鍵約束列,但是,它有可能在其他列中含有許多的唯一約束。
?
主鍵 | 聚集索引 | |
用途 | 強(qiáng)制表的實(shí)體完整性 | 對(duì)數(shù)據(jù)行的排序,方便查詢用 |
一個(gè)表多少個(gè) | 一個(gè)表最多一個(gè)主鍵 | 一個(gè)表最多一個(gè)聚集索引 |
是否允許多個(gè)字段來定義 | 一個(gè)主鍵可以多個(gè)字段來定義 | 一個(gè)索引可以多個(gè)字段來定義 |
是否允許 null 數(shù)據(jù)行出現(xiàn) |
如果要?jiǎng)?chuàng)建的數(shù)據(jù)列中數(shù)據(jù)存在null,無法建立主鍵。
創(chuàng)建表時(shí)指定的 PRIMARY KEY 約束列隱式轉(zhuǎn)換為 NOT NULL。 |
沒有限制建立聚集索引的列一定必須 not null .
也就是可以列的數(shù)據(jù)是 null 參看最后一項(xiàng)比較 |
是否要求數(shù)據(jù)必須唯一 | 要求數(shù)據(jù)必須唯一 |
數(shù)據(jù)即可以唯一,也可以不唯一??茨愣x這個(gè)索引的 UNIQUE 設(shè)置。
(這一點(diǎn)需要看后面的一個(gè)比較,雖然你的數(shù)據(jù)列可能不唯一,但是系統(tǒng)會(huì)替你產(chǎn)生一個(gè)你看不到的唯一列) |
創(chuàng)建的邏輯 |
數(shù)據(jù)庫在創(chuàng)建主鍵同時(shí),會(huì)自動(dòng)建立一個(gè)唯一索引。
如果這個(gè)表之前沒有聚集索引,同時(shí)建立主鍵時(shí)候沒有強(qiáng)制指定使用非聚集索引,則建立主鍵時(shí)候,同時(shí)建立一個(gè)唯一的聚集索引 |
如果未使用 UNIQUE 屬性創(chuàng)建聚集索引,數(shù)據(jù)庫引擎 將向表自動(dòng)添加一個(gè)四字節(jié) uniqueifier 列。
必要時(shí),數(shù)據(jù)庫引擎 將向行自動(dòng)添加一個(gè) uniqueifier 值,使每個(gè)鍵唯一。此列和列值供內(nèi)部使用,用戶不能查看或訪問。 |
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
