摘要:在數(shù)據(jù)庫(kù)廣泛應(yīng)用的當(dāng)下,保證數(shù)據(jù)的準(zhǔn)確性和有效性顯得尤為重要。文章基于SQL Server數(shù)據(jù)庫(kù),分析了其數(shù)據(jù)完整性的概念及分類(lèi),通過(guò)典型例子幫助用戶了解相關(guān)方法的使用。
關(guān)鍵詞:SQL Server;數(shù)據(jù)完整性;約束
引言
在信息技術(shù)迅速發(fā)展的今天,數(shù)據(jù)庫(kù)應(yīng)用越來(lái)越廣泛。如網(wǎng)站、醫(yī)療、交通、高校、政府、企業(yè)等無(wú)一不每天在利用數(shù)據(jù)庫(kù)存儲(chǔ)與管理著大量的數(shù)據(jù)。而往往在數(shù)據(jù)錄入時(shí),會(huì)因種種原因經(jīng)常會(huì)出現(xiàn)重復(fù)、無(wú)效、錯(cuò)誤等信息。在眾多后臺(tái)數(shù)據(jù)庫(kù)管理系統(tǒng)中,因SQL Server有著功能強(qiáng)大、操作簡(jiǎn)便等特點(diǎn),受到了廣大數(shù)據(jù)庫(kù)用戶喜愛(ài),文章基于SQL Server數(shù)據(jù)庫(kù)介紹數(shù)據(jù)完整性機(jī)制以及相關(guān)應(yīng)用[1]。
1數(shù)據(jù)完整性的概念和分類(lèi)
數(shù)據(jù)完整性是指存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)的一致性和準(zhǔn)確性[2]。它是應(yīng)用防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無(wú)效操作或錯(cuò)誤信息而提出的。數(shù)據(jù)完整性分為四類(lèi):實(shí)體完整性、域完整性、參照完整性和用戶自定義完整性。其定義分別為:
實(shí)體完整性:是指保證表中所有的行唯一。實(shí)體完整性要求表中的所有行都要有一個(gè)唯一的標(biāo)識(shí)符,即通過(guò)設(shè)置“主鍵”來(lái)實(shí)現(xiàn)。數(shù)據(jù)庫(kù)中的“主鍵”字段則是不能輸入重復(fù)值或空值,所謂“空值”其實(shí)就是“沒(méi)有”或“無(wú)意義”的值。反言之,如果主屬性取了空值,則無(wú)法進(jìn)行唯一標(biāo)識(shí),這與現(xiàn)實(shí)世界的應(yīng)用環(huán)境相矛盾。
域完整性:是指一個(gè)列的輸入有效性。域完整性主要用于保證給定字段數(shù)據(jù)的輸入有效性,強(qiáng)制域完整性的方法有:限制類(lèi)型、格式或可能值的范圍。如限制學(xué)生成績(jī)必須在0~100之間,性別只能是“男”或“女”等。
參照完整性:是指保證主關(guān)鍵字和外部關(guān)鍵字之間的參照關(guān)系。參照完整性又稱(chēng)引用完整性,利用“外鍵”來(lái)確保相關(guān)聯(lián)的表(兩個(gè)或兩個(gè)以上表)間數(shù)據(jù)的一致性。當(dāng)添加、刪除和修改記錄時(shí),參照完整性可以保證表之間已定義的關(guān)系,確保鍵值在所有表中一致。如向“學(xué)生成績(jī)表”中添加某個(gè)學(xué)生成績(jī)時(shí)必須確保所有添加成績(jī)的學(xué)生必須在“學(xué)生表”中是存在的,否則不允許添加。
用戶自定義完整性:是指根據(jù)應(yīng)用環(huán)境的要求和實(shí)際的需要,對(duì)某一具體應(yīng)用所涉及的數(shù)據(jù)提出約束性條件。這一約束機(jī)制一般不應(yīng)由應(yīng)用程序提供,而應(yīng)有由關(guān)系模型提供定義并檢驗(yàn),用戶定義完整性主要包括字段有效性約束和記錄有效性。
2數(shù)據(jù)完整性的應(yīng)用
為了確保數(shù)據(jù)的完整與有效性,防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義規(guī)定的數(shù)據(jù),防止因錯(cuò)誤信息的輸入、輸出而造成無(wú)效的操作或錯(cuò)誤信息,SQL Servr提供了4種手段來(lái)實(shí)現(xiàn)數(shù)據(jù)完整性,即缺省值、規(guī)則、約束和觸發(fā)器等[3]。
2.1通過(guò)缺省值實(shí)現(xiàn)數(shù)據(jù)完整性
缺省值即默認(rèn)值,是為列提供數(shù)據(jù)的一種方式,如果用戶在進(jìn)行插入操作時(shí)不為列輸入任務(wù)數(shù)據(jù),則使用缺省值自動(dòng)輸入??衫帽碓O(shè)計(jì)器創(chuàng)建表時(shí)指定默認(rèn)值,也可在使用Create Table語(yǔ)句中的Default子句指定默認(rèn)值。
SQL語(yǔ)句中利用默認(rèn)值實(shí)現(xiàn)數(shù)據(jù)完整性應(yīng)用例子如下:
Create Table Teacher???--創(chuàng)建教師表
(t_id?char(10),
t_name varchar(10),
t_professor varchar(10) default(“助教”))--職稱(chēng)字段默認(rèn)值為助教
2.2通過(guò)規(guī)則實(shí)現(xiàn)數(shù)據(jù)完整性
規(guī)則是用以限制存儲(chǔ)在表中或用戶自定義數(shù)據(jù)類(lèi)型的值,是獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象,只有將規(guī)則綁定到列或用戶自定義數(shù)據(jù)類(lèi)型時(shí),規(guī)則才能起作用,而表中的每列或每個(gè)用戶定義數(shù)據(jù)類(lèi)型只能和一個(gè)規(guī)則綁定。如果要?jiǎng)h除規(guī)則,則應(yīng)先解除綁定。
SQL語(yǔ)句中利用規(guī)則實(shí)現(xiàn)數(shù)據(jù)完整性應(yīng)用例子如下:
Create Rule r_age as @age<=100 and @age>=1
--定義規(guī)則年齡限制區(qū)間
Exec sp_bindrule ‘r_age’,’teacher.age’
--使用存儲(chǔ)過(guò)程綁定規(guī)則
2.3通過(guò)約束實(shí)現(xiàn)數(shù)據(jù)完整性
約束是指在創(chuàng)建表時(shí)設(shè)置各種條件對(duì)輸入、修改的數(shù)據(jù)進(jìn)行監(jiān)測(cè),使不符合語(yǔ)義規(guī)定的數(shù)據(jù)不能進(jìn)入數(shù)據(jù)庫(kù),以確保數(shù)據(jù)的完整性與有效性。SQL Server數(shù)據(jù)庫(kù)提供了主鍵約束、外鍵約束、唯一約束、檢查約束、非空約束與自動(dòng)編號(hào)約束等6種約束方式。
2.3.1主鍵約束(PRIMARY KEY)
主鍵約束是為了保證數(shù)據(jù)實(shí)體完整性,用于唯一地標(biāo)識(shí)表中的每一行。主鍵字段不能出現(xiàn)重復(fù)值或空值。在一個(gè)表中只能有一個(gè)主鍵,主鍵可以是一個(gè)字段,也可以是字段的組合。
Create Table Department --創(chuàng)建系部表
(d_id?char(10) PRIMARY KEY, --系部編號(hào),設(shè)置為主鍵
d_name varchar(20),
d_leader varchar(10))
2.3.2外鍵約束(FOREIGN KEY)
外鍵約束是為了保證數(shù)據(jù)參照完整性,用于在建立一個(gè)或多個(gè)表的字段之間的引用聯(lián)系。在創(chuàng)建時(shí)在被引用表上創(chuàng)建主鍵或唯一約束,在引用表的字段上創(chuàng)建外鍵約束。外鍵約束必須是另一個(gè)表的主鍵,這樣在當(dāng)前表上才能稱(chēng)為外鍵。
Create Table Teacher
(t_id?char(10) PRIMARY KEY, --教師工號(hào),設(shè)置為主鍵
t_name varchar(10),
t_sex char(2)CHECK(t_sex=’男’or t_sex=’女’),
t_professor varchar(10) default(“助教”))
d_id char(10) FOREIGN KEY references Deparment(d_id))
--系部編號(hào),外鍵,與系部表的“系部編號(hào)”關(guān)聯(lián)
2.3.3唯一約束(UNIQUE)
唯一約束要求該列唯一,允許有空值,但只能出現(xiàn)一個(gè)空值。與主鍵約束類(lèi)似,也具有唯一性,為表中的一列或多列提供數(shù)據(jù)實(shí)體完整性,一個(gè)表可以設(shè)置多個(gè)唯一約束。
Create Table Department
(d_id?char(10) PRIMARY KEY,
d_name varchar(20) UNIQUE,?--系部名稱(chēng),唯一約束
d_leader varchar(10) UNIQUE))?--系部領(lǐng)導(dǎo),唯一約束
2.3.4檢查約束(CHECK)
檢查約束是為了保證域完整性,檢查約束可為所屬字段設(shè)定一個(gè)邏輯表達(dá)式來(lái)限定有效取值范圍。檢查約束只在添加和修改記錄時(shí)有效,在刪除時(shí)無(wú)效。一個(gè)列上只能定義一個(gè)檢查約束。
Create Table Teacher
(t_id?char(10) PRIMARY KEY,
t_name varchar(10),
t_sex char(2)CHECK(t_sex=’男’or t_sex=’女’),
--教師性別,檢查約束
t_professor varchar(10) default(“助教”))
d_id char(10) FOREIGN KEY references Deparment(d_id))
2.3.5非空約束(NOT NULL)
非空約束也是為了保證數(shù)據(jù)實(shí)體完整性,有些表中字段雖然不需要設(shè)置主鍵字段,但其信息不允許為空值,則可利用非空約束來(lái)設(shè)置。
Create Table Teacher
(t_id?char(10) PRIMARY KEY,
t_name varchar(10) NOT NULL,?--教師姓名,非空約束
t_sex char(2)CHECK(t_sex=’男’or t_sex=’女’),
t_professor varchar(10) default(“助教”))
d_id char(10) FOREIGN KEY references Deparment(d_id))
2.3.6自動(dòng)編號(hào)約束(IDENTITY)
自動(dòng)編號(hào)約束又稱(chēng)作標(biāo)識(shí)列,采用數(shù)字編號(hào)的方式依次增加一個(gè)增量。是為那些數(shù)字順序遞增的列準(zhǔn)備的約束,可以自動(dòng)完成數(shù)值添加。
Create Table Department
(d_id?int identity(1,1)PRIMARY KEY,
--系部編號(hào),整型,主鍵約束,自動(dòng)編號(hào)(增量為1)
d_name varchar(20) UNIQUE,
d_leader varchar(10) UNIQUE))
若要實(shí)現(xiàn)更為復(fù)雜的數(shù)據(jù)約束,可以使用觸發(fā)器實(shí)現(xiàn),在此不再贅述。
3結(jié)束語(yǔ)
通過(guò)上述數(shù)據(jù)完整性的概念與分類(lèi)闡述,并通過(guò)相關(guān)例子的實(shí)現(xiàn)來(lái)說(shuō)明數(shù)據(jù)完整性是如何建立和實(shí)施。在具體應(yīng)用過(guò)程中,需要結(jié)合實(shí)際情況選擇相應(yīng)方法來(lái)保證數(shù)據(jù)的準(zhǔn)確性和有效性。
作者簡(jiǎn)介:
孫楓(1977-),女,江蘇南通人,中學(xué)高級(jí),碩士研究生(方向:現(xiàn)代教育技術(shù)),江蘇省南通第一中學(xué)信息中心教師。
參考文獻(xiàn):
[1]陳潔,薛恒威. SQL Server數(shù)據(jù)庫(kù)中數(shù)據(jù)完整性的分析與實(shí)踐[J]河北軟件職業(yè)技術(shù)學(xué)院學(xué)院學(xué)報(bào),2018
[2]陳金萍,陳艷,姜廣坤. SQL Server2012數(shù)據(jù)庫(kù)項(xiàng)目化教程[M].清華大學(xué)出版社,2017
[3]從艷. SQL Server數(shù)據(jù)庫(kù)完整性的維護(hù)[J].電腦知識(shí)與技術(shù),2007
[4]陳增祥. SQL Server數(shù)據(jù)庫(kù)數(shù)據(jù)完整性的研究與分析[J].信息安全與技術(shù),2012
[5]李浩,周媛媛. SQL Server數(shù)據(jù)完整性及約束[J].科技與企業(yè),2013