徐景秀 熊金猛
摘要:文章從約束和索引的作用及它們之間的相互聯(lián)系觀點(diǎn)出發(fā),概述了約束的功能及概念,索引的功能及概念,與索引相聯(lián)系的兩種約束。在實(shí)例數(shù)據(jù)庫sale中的customer表、product表和proin表上創(chuàng)建約束和索引,引證提出的觀點(diǎn)創(chuàng)建約束與索引的聯(lián)系與作用、刪除約束與索引的聯(lián)系與作用及創(chuàng)建索引與刪除索引對(duì)約束的影響等。
關(guān)鍵詞:約束和索引;聯(lián)系作用;約束影響
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-2374(2014)27-0045-02
1 約束的功能及概念
約束定義了數(shù)據(jù)的有效性規(guī)則,其目的在于防止數(shù)據(jù)庫中出現(xiàn)不正確或不一致的數(shù)據(jù),可以自動(dòng)維護(hù)并保存數(shù)據(jù)庫中的數(shù)據(jù)完整性。約束是SQL Server提供的自動(dòng)強(qiáng)制數(shù)據(jù)完整性的一種方式,它是通過定義列的取值規(guī)則來維護(hù)數(shù)據(jù)的完整性,約束定義關(guān)于列中允許值的規(guī)則,是強(qiáng)制完整性的標(biāo)準(zhǔn)機(jī)制。使用約束優(yōu)先于使用觸發(fā)器、規(guī)則和默認(rèn)值。查詢分析器也使用約束定義生成高性能的查詢執(zhí)行計(jì)劃。
2 索引的功能及概念
索引是通過數(shù)據(jù)行表中的索引關(guān)鍵值來指向表中的數(shù)據(jù)行,這樣數(shù)據(jù)庫引擎不用掃描整個(gè)表就能快速定位到所需要的數(shù)據(jù)行。相反,如果沒有索引則會(huì)導(dǎo)致SQL Server搜索表中所有的數(shù)據(jù)行難以找到匹配結(jié)果。可以在表或視圖的一列或多列上創(chuàng)建索引,基于兩列或多列上建立的索引稱為復(fù)合索引;如果表中任意兩行被索引的列值不允許出現(xiàn)重復(fù)值,那么這種索引稱為惟一索引。索引主要分為兩種,即聚集索引和非聚集索引。
3 與索引有聯(lián)系的主要約束
與索引有聯(lián)系的主要約束有以下兩種:
PRIMARY KEY約束:主鍵約束標(biāo)識(shí)列或列集,它可用來強(qiáng)制數(shù)據(jù)的完整性,在數(shù)據(jù)表中主鍵只能有一個(gè),主鍵可以是一列,也可以是由多列所組成的主鍵,并且主鍵約束不允許在創(chuàng)建主鍵的列上有空值。
UNIQUE(惟一)約束:惟一約束在列集內(nèi)強(qiáng)制執(zhí)行值的惟一性,即在列中不允許有相同的值。但是惟一約束允許在創(chuàng)建惟一索引的列上有空值。
以下所討論的論點(diǎn)均用銷售數(shù)據(jù)庫實(shí)例sale來論證說明。
4 約束與索引的聯(lián)系與作用
4.1 創(chuàng)建約束與索引的聯(lián)系與作用
4.1.1 主鍵約束的創(chuàng)建與聚集索引的聯(lián)系與作用。用戶在數(shù)據(jù)庫表中(該表目前沒有聚集索引)創(chuàng)建主鍵約束時(shí),SQL Server將自動(dòng)在建有這些約束的列上創(chuàng)建對(duì)應(yīng)的聚集索引;若該表已經(jīng)創(chuàng)建了聚集索引,則再為之創(chuàng)建主鍵約束,SQL Server將自動(dòng)在建有這些約束的列上創(chuàng)建惟一非聚集索引。下面在銷售數(shù)據(jù)庫sale中的customer表(無聚集索引)上的Cusno列創(chuàng)建主鍵p1,在proin表(已有聚集索引i1)上創(chuàng)建主鍵約束PK_proin進(jìn)行論證說明。
alter table customeradd constraint p1 primary key(CusNo)
Alter table prion add constraint PK_proin primary key(inputdate,prono)
執(zhí)行代碼后,customer表添加了主鍵p1,再觀察customer表上的索引,可以看出系統(tǒng)同時(shí)自動(dòng)為它創(chuàng)建了一個(gè)與主鍵同名p1的聚集索引,若proin表上已有聚集索引時(shí),再創(chuàng)建主鍵約束PK_proin,SQL Server將自動(dòng)在建有這些約束的列上創(chuàng)建同名的惟一非聚集索引PK_proin。
由關(guān)系數(shù)據(jù)庫表設(shè)計(jì)的要求,每張關(guān)系表必須設(shè)計(jì)一個(gè)主鍵約束,很多時(shí)候聚集索引由系統(tǒng)自動(dòng)創(chuàng)建并與主鍵同名,即數(shù)據(jù)行按照主鍵列值物理排序,用戶不用單獨(dú)創(chuàng)建設(shè)置。
4.1.2 創(chuàng)建惟一約束與惟一索引的聯(lián)系與作用。用戶在數(shù)據(jù)庫表中創(chuàng)建惟一約束時(shí),SQL Server將自動(dòng)在建有這些約束的列上創(chuàng)建對(duì)應(yīng)的惟一索引,下面在銷售數(shù)據(jù)庫sale中的product表上的proname列創(chuàng)建惟一約束進(jìn)行論證說明。
alter table product add constraint u1 unique(proname)
執(zhí)行代碼后,product表添加了惟一約束,再觀察product表上的索引,系統(tǒng)同時(shí)自動(dòng)為它創(chuàng)建了一個(gè)與惟一約束同名u1的惟一索引。
在SQL Server系統(tǒng)中,創(chuàng)建惟一約束的目的是確保在列中不輸入重復(fù)值保證一列或多列的實(shí)體完整性;而在創(chuàng)建每個(gè)UNIQUE約束時(shí)系統(tǒng)自動(dòng)創(chuàng)建一個(gè)惟一索引;SQL Server允許為一個(gè)表創(chuàng)建多個(gè)UNIQUE約束的同時(shí)產(chǎn)生多個(gè)UNIQUE索引。
4.2 刪除約束與索引的聯(lián)系與作用
用戶創(chuàng)建了主鍵約束、惟一約束或某個(gè)索引后,若覺得不合適想要作刪除操作,其結(jié)果又是怎樣,它們之間的操作是有聯(lián)系還是相互獨(dú)立的呢?
如果是創(chuàng)建主鍵約束時(shí)系統(tǒng)自動(dòng)創(chuàng)建的聚集索引作刪除操作,現(xiàn)刪除上例sale數(shù)據(jù)庫中Cusno列主鍵p1,proname列上的惟一約束u1。
Alter table customer Drop constraint p1
Alter table product Drop constraint u1
執(zhí)行上面代碼,customer表和product表刪除了主鍵約束p1和惟一約束u1,同時(shí)customer表和product表中的索引也沒有了。由此可得出:通過修改表添加約束時(shí)創(chuàng)建的主鍵約束p1或惟一約束u1,使用修改表刪除主鍵約束p1或惟一約束u1,都會(huì)使主鍵約束p1及聚集索引p1或惟一約束u1及惟一索引u1同時(shí)刪除。
4.3 創(chuàng)建索引與刪除索引對(duì)約束的影響
在SQL Server中,創(chuàng)建索引操作,對(duì)約束沒有任何影響?,F(xiàn)在customer表和product表中分別創(chuàng)建聚集索引c1和u1。
create clustered index c1 on customer(CusNo)
create unique index u1 on product(proname)
在SQL Server中,只能刪除由創(chuàng)建索引語句創(chuàng)建的索引,并不能刪除由創(chuàng)建主鍵約束或惟一約束語句創(chuàng)建的聚集索引或非聚集索引,刪除上面的索引c1和u1,其代碼為:
Drop index customer.c1
Drop index product.u1
若刪除上面的聚集索引p1,用代碼Drop index customer.p1,則彈出如下所示錯(cuò)誤消息:消息9723,級(jí)別16,狀態(tài)4,第二行。
不允許對(duì)索引“customer.p1”顯式地使用DROP INDEX。該索引正用于PRIMARY KEY約束的強(qiáng)制執(zhí)行。
5 結(jié)語
本文通過創(chuàng)建約束和索引,得出約束與索引之間的創(chuàng)建聯(lián)系與作用,以及它們之間的創(chuàng)建對(duì)彼此影響區(qū)別;通過刪除約束和索引,得出約束與索引之間的刪除聯(lián)系和作用,以及它們之間的刪除對(duì)彼此影響
區(qū)別。
參考文獻(xiàn)
[1] 劉志成.數(shù)據(jù)庫系統(tǒng)原理與應(yīng)用SQL Server2000[M].北京:機(jī)械工業(yè)出版社,2007.
[2] 薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2000.
[3] 余芳.SQL Server2005數(shù)據(jù)庫管理與開發(fā)[M].廣州:冶金工業(yè)出版社,2006.
[4] 徐人鳳.SQL Server2005數(shù)據(jù)庫及應(yīng)用[M].北京:高等教育出版社,2007.
作者簡(jiǎn)介:徐景秀(1980-),女,湖北浠水人,黃岡師范學(xué)院專職教師,講師,研究方向:信息管理。