




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第8章數(shù)據(jù)完整性
《數(shù)據(jù)庫技術(shù)與應(yīng)用-SQLServer2008》8.1使用規(guī)則實(shí)
施數(shù)據(jù)完整
性8.2使用默認(rèn)值
實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性.8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 1.數(shù)據(jù)完整性數(shù)據(jù)完整性是防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無效操作或錯(cuò)誤信息而提出的。數(shù)據(jù)完整性主要有以下3種類型:實(shí)體完整性(EntityIntegrity)參照完整性(ReferentialIntegrity)用戶自定義的完整性(User-definedIntegrity)在SQLServer2008中提供了完善的數(shù)據(jù)完整性機(jī)制,可以通過各種規(guī)則、默認(rèn)、約束和觸發(fā)器等數(shù)據(jù)庫對象來保證數(shù)據(jù)的完整性。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 2.規(guī)則規(guī)則(Rule)是數(shù)據(jù)庫中對存儲在表的列或用戶定義數(shù)據(jù)類型中的值的規(guī)定和限制。規(guī)則是單獨(dú)存儲的獨(dú)立的數(shù)據(jù)庫對象。規(guī)則與其作用的表或用戶定義數(shù)據(jù)類型是相互獨(dú)立的,即表或用戶定義對象的刪除、修改不會對與之相連的規(guī)則產(chǎn)生影響。規(guī)則的管理主要包括創(chuàng)建、查看、綁定、松綁和刪除等操作。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.1創(chuàng)建規(guī)則
創(chuàng)建規(guī)則只能通過Transact-SQL的CREATERULE語句,而不能使用SQLServer管理平臺工具創(chuàng)建。CREATERULE語法格式如下:CREATERULErule_nameAScondition_expression其中condition_expression子句是規(guī)則的定義。condition_expression子句可以是能用于WHERE條件子句的任何表達(dá)式,它可以包含算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和謂詞(如IN、LIKE、BETWEEN等)。注意:ondition_expression子句中的表達(dá)式的變量必須以字符“@”開頭,通常情況下,該變量的名稱應(yīng)與規(guī)則所關(guān)聯(lián)的列或用戶定義的數(shù)據(jù)類型具有相同的名字。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.1創(chuàng)建規(guī)則
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-1】創(chuàng)建雇傭日期規(guī)則hire_date_rule。
CREATERULEhire_date_rule
AS@hire_date>='1980-01-01'and@hire_date<=getdate()
【例8-2】創(chuàng)建性別規(guī)則sex_rule。CREATERULEsex_ruleAS@sexin('男','女')8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.1創(chuàng)建規(guī)則
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-3】創(chuàng)建評分規(guī)則grade_rule。
CREATERULEgrade_rule
AS@valuebetween1and100
【例8-4】創(chuàng)建字符規(guī)則my_character_rule。CREATErulemy_character_ruleAs@valuelike'[a-f]%[0-9]'8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.2查看規(guī)則
使用系統(tǒng)存儲過程sp_helptext語句可查看某個(gè)規(guī)則的定義信息,或在SQLServer管理平臺中,點(diǎn)擊指定數(shù)據(jù)庫下面的“可編程性”,選中“規(guī)則”后找到要查看的規(guī)則名稱,單擊鼠標(biāo)右鍵,在彈出的菜單中選擇“編寫規(guī)則腳本為”→“CREATE到”→“新查詢編輯器窗口”來查看規(guī)則。sp_helptext語法如下:sp_helptext[@objname=]'name'其中[@objname=]'name'子句指明對象的名稱,用Sp_helptext存儲過程查看的對象可以是當(dāng)前數(shù)據(jù)庫中的規(guī)則、默認(rèn)值、觸發(fā)器、視圖或未加密的存儲過程。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.2查看規(guī)則
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-5】創(chuàng)建查看規(guī)則hire_date_rule的文本信息。EXECUTEsp_helptexthire_date_rule運(yùn)行結(jié)果如圖8-1所示:8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.3規(guī)則的綁定與松綁
創(chuàng)建規(guī)則后,規(guī)則只是一個(gè)存在于數(shù)據(jù)庫中的對象,并未發(fā)生作用。需要將規(guī)則與數(shù)據(jù)庫表或用戶定義對象聯(lián)系起來,才能達(dá)到創(chuàng)建規(guī)則的目的。聯(lián)系的方法稱為綁定。綁定就是指定規(guī)則作用于哪個(gè)表的哪一列或哪個(gè)用戶定義數(shù)據(jù)類型。當(dāng)向綁定了規(guī)則的列或綁定了規(guī)則的用戶定義數(shù)據(jù)類型的所有列中插入或更新數(shù)據(jù)時(shí),新的數(shù)據(jù)必須符合規(guī)則。表的一列或一個(gè)用戶定義數(shù)據(jù)類型只能與一個(gè)規(guī)則相綁定,而一個(gè)規(guī)則可以綁定多個(gè)對象。解除規(guī)則與對象的綁定稱為松綁。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 1.用存儲過程sp_bindrule綁定規(guī)則
系統(tǒng)存儲過程sp_bindrule可以綁定一個(gè)規(guī)則到表的一個(gè)列或一個(gè)用戶定義數(shù)據(jù)類型上。其語法格式如下:sp_bindrule[@rulename=]'rule',[@objname=]'object_name'[,[@futureonly=]'futureonly']8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.3規(guī)則的綁定與松綁
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-6】將例8-1創(chuàng)建的規(guī)則hire_date_rule綁定到employee表的hire_date列上。EXECsp_bindrulehire_date_rule,'employee.hire_date'運(yùn)行結(jié)果如下:已將規(guī)則綁定到表的列?!纠?-8】創(chuàng)建綁定例8-2創(chuàng)建的規(guī)則sex_rule到employee表的字段sex。EXECsp_bindrulesex_rule,'employee.sex'運(yùn)行結(jié)果如下:已將規(guī)則綁定到表的列。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 2.用系統(tǒng)存儲過程sp_unbindrule解除規(guī)則的綁定
如果不再使用規(guī)則,可以解除規(guī)則。使用系統(tǒng)存儲過程sp_unbindrule語句可解除規(guī)則與列或用戶定義數(shù)據(jù)類型的綁定,其語法格式如下:sp_unbindrule[@objname=]'object_name'[,[@futureonly=]'futureonly']參數(shù)的含義與sp_bindrule相同。其中,'futureonly'選項(xiàng)指定現(xiàn)有的由此用戶定義數(shù)據(jù)類型定義的列仍然保持與此規(guī)則的綁定。如果不指定此項(xiàng),所有由此用戶定義數(shù)據(jù)類型定義的列也將隨之解除與此規(guī)則的綁定。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.3規(guī)則的綁定與松綁
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-9】解除例8-6和例8-7綁定在employee表的hire_date列和用戶定義數(shù)據(jù)類型pat_char上的規(guī)則。EXECsp_unbindrule'employee.hire_date'運(yùn)行結(jié)果如下:已解除了表列與規(guī)則之間的綁定。EXECsp_unbindrulepat_char,'futureonly'運(yùn)行結(jié)果如下:已解除了數(shù)據(jù)類型與規(guī)則之間的綁定。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性 8.1.4刪除規(guī)則當(dāng)不再需要規(guī)則時(shí),可以在SQLServer管理平臺中選擇規(guī)則對象,單擊右鍵,從快捷菜單中選擇“刪除”選項(xiàng)刪除規(guī)則,也可使用DROPRULE語句刪除當(dāng)前數(shù)據(jù)庫中的一個(gè)或多個(gè)規(guī)則。其語法格式如下:DROPRULE{rule_name}[,…n]注意:在刪除一個(gè)規(guī)則前,必須先將與其綁定的對象解除綁定,否則,在執(zhí)行刪除語句時(shí)會出錯(cuò)。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-10】刪除例8-1和8-2中創(chuàng)建的規(guī)則。DROPRULEsex_rule,hire_date_rule8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 1.默認(rèn)值默認(rèn)值(Default)是用戶輸入記錄時(shí)向沒有指定具體數(shù)據(jù)的列中自動插入的數(shù)據(jù)。默認(rèn)值對象與CREATETABLE或ALTERTABLE語句操作表時(shí)用默認(rèn)約束指定的默認(rèn)值功能相似,兩者的區(qū)別類似于規(guī)則與檢查約束在使用上的區(qū)別。默認(rèn)值對象可用于多個(gè)列或用戶定義數(shù)據(jù)類型,它不會因數(shù)據(jù)列或用戶定義數(shù)據(jù)類型的修改、刪除等操作而受影響。表的一列或一個(gè)用戶定義數(shù)據(jù)類型只能與一個(gè)默認(rèn)值相綁定。默認(rèn)值對象主要包括創(chuàng)建、查看、綁定、松綁和刪除操作。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 8.2.1創(chuàng)建默認(rèn)值
和規(guī)則一樣,默認(rèn)值對象的創(chuàng)建只能使用Transact-SQL語句CREATEDEFAULT來創(chuàng)建,其語法格式如下:CREATEDEFAULTdefault_nameASconstant_expression其中,constant_expression是默認(rèn)值的定義,為一常量表達(dá)式,可以使用數(shù)學(xué)表達(dá)式或函數(shù)等,但不能包含表的列名或其他數(shù)據(jù)庫對象。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 8.2.1創(chuàng)建默認(rèn)值
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-11】創(chuàng)建生日默認(rèn)值birthday_defa。CREATEDEFAULTbirthday_defaAS'1978-1-1'【例8-12】創(chuàng)建當(dāng)前日期默認(rèn)值today_defa。CREATEDEFAULTtoday_defaASgetdate()上述語句創(chuàng)建一個(gè)today_defa默認(rèn)值,其常量表達(dá)式是一個(gè)內(nèi)置函數(shù),表示自動填入的默認(rèn)值是當(dāng)前系統(tǒng)日期。8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 8.2.2查看默認(rèn)值
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性使用sp_helptext系統(tǒng)存儲過程可以查看默認(rèn)值的細(xì)節(jié)?!纠?-13】查看默認(rèn)值today_defa。EXECsp_helptexttoday_defa運(yùn)行結(jié)果如圖8-2所示。8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 8.2.3默認(rèn)值的綁定與松綁
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性創(chuàng)建默認(rèn)值后,默認(rèn)值僅僅只是一個(gè)存在于數(shù)據(jù)庫中的對象,并未發(fā)生作用。同規(guī)則一樣,需要將默認(rèn)值與數(shù)據(jù)庫表的列或用戶定義數(shù)據(jù)類型進(jìn)行綁定,這樣才能將創(chuàng)建的默認(rèn)值應(yīng)用到數(shù)據(jù)列或用戶定義的數(shù)據(jù)類型中。8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 1.用系統(tǒng)存儲過程sp_bindefault綁定默認(rèn)值
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性系統(tǒng)存儲過程sp_bindefault可以綁定一個(gè)默認(rèn)值到表的一個(gè)列或一個(gè)用戶定義數(shù)據(jù)類型上。其語法格式如下:sp_bindefault[@defname=]'default',[@objname=]'object_name'[,[@futureonly=]'futureonly']8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 1.用系統(tǒng)存儲過程sp_bindefault綁定默認(rèn)值
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-14】綁定默認(rèn)值today_defa到employee表的hire_date列上。EXECsp_bindefaulttoday_defa,'employee.hire_date'運(yùn)行結(jié)果如下:已將默認(rèn)值綁定到列。8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 2.用系統(tǒng)存儲過程sp_unbindefault解除默認(rèn)值的綁定
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性系統(tǒng)存儲過程sp_unbindefault可以解除默認(rèn)值與表的列或用戶定義數(shù)據(jù)類型的綁定,其語法格式如下:sp_unbindefault[@objname=]'object_name'[,[@futureonly=]'futureonly']8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 2.用系統(tǒng)存儲過程sp_unbindefault解除默認(rèn)值的綁定8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-15】解除默認(rèn)值today_defa與表employee的hire_date列的綁定。EXECsp_unbindefault'employee.hire_date'運(yùn)行結(jié)果如下:已解除了表列與其默認(rèn)值之間的綁定。注意:如果列同時(shí)綁定了一個(gè)規(guī)則和一個(gè)默認(rèn)值,那么默認(rèn)值應(yīng)該符合規(guī)則的規(guī)定。不能綁定默認(rèn)值到一個(gè)用CREATETABLE或ALTERTABLE語句創(chuàng)建或修改表時(shí)用DEFAULT選項(xiàng)指定了默認(rèn)值的列上。8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性 8.2.4刪除默認(rèn)值
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性當(dāng)不再需要定義默認(rèn)值時(shí),可以在SQLServer管理平臺中選擇默認(rèn)值對象,單擊右鍵,從快捷菜單中選擇“刪除”選項(xiàng)刪除默認(rèn)值,也可以使用DROPDEFAULT語句刪除當(dāng)前數(shù)據(jù)庫中的一個(gè)或多個(gè)默認(rèn)值。其語法格式如下:DROPDEFAULT{default_name}[,…n]注意:在刪除一個(gè)默認(rèn)值前必須先將與其綁定的對象解除綁定,否則,在執(zhí)行刪除語句時(shí)會出錯(cuò)?!纠?-16】刪除生日默認(rèn)值birthday_defa。DROPDEFAULTbirthday_defa8.3使用約束實(shí)施數(shù)據(jù)完整性 1.約束約束(Constraint)是SQLServer提供的自動保持?jǐn)?shù)據(jù)庫中數(shù)據(jù)完整性的一種機(jī)制,它定義了可輸入表或表的單個(gè)列中的數(shù)據(jù)的限制條件。使用約束優(yōu)先于使用觸發(fā)器、規(guī)則和默認(rèn)值。約束獨(dú)立于表結(jié)構(gòu),作為數(shù)據(jù)庫定義部分在CREATETABLE語句中聲明,可以在不改變表結(jié)構(gòu)的基礎(chǔ)上,通過ALTERTABLE語句添加或刪除。當(dāng)表被刪除時(shí),表所帶的所有約束定義也隨之被刪除。在SQLServer中有6種約束:主鍵約束、外鍵約束、唯一性約束、檢查約束、默認(rèn)約束和非空值約束。其中非空值約束已在第5章中做了詳細(xì)介紹,本節(jié)只介紹其他5種約束。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.1主鍵約束
和規(guī)則一樣,默認(rèn)值對象的創(chuàng)建只能使用Transact-SQL語句CREATEDEFAULT來創(chuàng)建,其語法格式如下:CREATEDEFAULTdefault_nameASconstant_expression其中,constant_expression是默認(rèn)值的定義,為一常量表達(dá)式,可以使用數(shù)學(xué)表達(dá)式或函數(shù)等,但不能包含表的列名或其他數(shù)據(jù)庫對象。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.1主鍵約束
表的一列或幾列組合的值在表中唯一地指定一行記錄,這樣的一列或多列稱為表的主鍵(PrimaryKey,PK),通過它可強(qiáng)制表的實(shí)體完整性。主鍵不允許為空值,且不同兩行的鍵值不能相同。表中可以有不止一個(gè)鍵唯一標(biāo)識行,每個(gè)鍵都稱為候選鍵,只可以選其中一個(gè)候選鍵作為表的主鍵,其他候選鍵稱作備用鍵。表本身并不要求一定要有主鍵,但應(yīng)該養(yǎng)成給表定義主鍵的良好習(xí)慣。在規(guī)范化的表中,每行中的所有數(shù)據(jù)值都完全依賴于主鍵。當(dāng)創(chuàng)建或更改表時(shí)可通過定義主鍵約束來創(chuàng)建主鍵。如果一個(gè)表的主鍵由單列組成,則該主鍵約束可定義為該列的列約束。如果主鍵由兩個(gè)以上的列組成,則該主鍵約束必須定義為表約束。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.1主鍵約束
定義列級主鍵約束的語法格式如下:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]定義表級主鍵約束的語法格式如下:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]{(column_name[,…n])}8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.1主鍵約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-17】在Sales數(shù)據(jù)庫中創(chuàng)建customer表,并聲明主鍵約束。CREATETABLESales.dbo.customer(customer_idbigintNOTNULLIDENTITY(0,1)PRIMARYKEY,customer_namevarchar(50)NOTNULL,linkman_namechar(8),addressvarchar(50),telephonechar(12)NOTNULL)8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.1主鍵約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-18】創(chuàng)建一個(gè)產(chǎn)品信息表goods1,將產(chǎn)品編號goods_id列聲明為主鍵。CREATETABLEgoods1(goods_idchar(6)NOTNULL,goods_namevarchar(50)NOTNULL,classification_idchar(6)NOTNULL,unit_pricemoneyNOTNULL,stock_quantityfloatNOTNULL,order_quantityfloatNULLCONSTRAINTpk_p_idPRIMARYKEY(goods_id))ON[PRIMARY]8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.1主鍵約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-19】根據(jù)商品銷售的時(shí)間和商品類別來確定銷售的商品的數(shù)量。CREATETABLEg_order(good_typeint,order_timedatetime,order_numint,CONSTRAINTg_o_keyPRIMARYKEY(good_type,order_time))本例由兩列組合成主鍵g_o_key,使用表約束來定義。8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.2外鍵約束
外鍵約束定義了表與表之間的關(guān)系。通過將一個(gè)表中一列或多列添加到另一個(gè)表中,創(chuàng)建兩個(gè)表之間的連接,這個(gè)列就成為第二個(gè)表的外鍵(ForeignKey,F(xiàn)K),即外鍵是用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間的連接的一列或多列,通過它可以強(qiáng)制參照完整性。當(dāng)一個(gè)表中的一列或多列的組合和其他表中的主鍵定義相同時(shí),就可以將這些列或列的組合定義為外鍵,并設(shè)定與它關(guān)聯(lián)的表或列。這樣,當(dāng)向具有外鍵的表插入數(shù)據(jù)時(shí),如果與之相關(guān)聯(lián)的表的列中沒有與插入的外鍵列值相同的值時(shí),系統(tǒng)會拒絕插入數(shù)據(jù)。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.2外鍵約束
定義表級外鍵約束的語法格式如下:[CONSTRAINTconstraint_name]FOREIGNKEY(column_name[,…n])REFERENCESref_table[(ref_column[,…n])][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}]][NOTFORREPLICATION]定義列級外鍵約束的語法格式如下:[CONSTRAINTconstraint_name][FOREIGNKEY]REFERENCESref_table[NOTFORREPLICATION]8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.2外鍵約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-20】創(chuàng)建一個(gè)訂貨表sell_order1,與例8-18創(chuàng)建的產(chǎn)品表goods1相關(guān)聯(lián)。CREATETABLEsell_order1(order_id1char(6)NOTNULL,goods_idchar(6)NOTNULL,employee_idchar(4)NOTNULL,customer_idchar(4)NOTNULL,transporter_idchar(4)NOTNULL,order_numfloatNULL,discountfloatNULL,order_datedatetimeNOTNULL,send_datedatetimeNULL,arrival_datedatetimeNULL,costmoneyNULL,CONSTRAINTpk_order_idPRIMARYKEY(order_id1),FOREIGNKEY(goods_id)REFERENCESgoods1(goods_id))8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.3唯一性約束
唯一性(unique)約束指定一個(gè)或多個(gè)列的組合的值具有唯一性,以防止在列中輸入重復(fù)的值,為表中的一列或者多列提供實(shí)體完整性。唯一性約束指定的列可以有NULL屬性。主鍵也強(qiáng)制執(zhí)行唯一性,但主鍵不允許空值,故主鍵約束強(qiáng)度大于唯一約束。因此主鍵列不能再設(shè)定唯一性約束。定義列級唯一性約束的語法格式如下:[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED]8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.3唯一性約束
唯一性約束應(yīng)用于多列時(shí)的定義格式如下:[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED](column_name[,…n])參數(shù)的含義與主鍵約束的參數(shù)含義相同。唯一性約束與主鍵約束的區(qū)別如下:(1)唯一性約束用于非主鍵的一列或列組合。(2)一個(gè)表可定義多個(gè)唯一性約束,只能定義一個(gè)主鍵約束。(3)唯一性約束可用于定義允許空值的列,而主鍵約束不能用于定義允許空值的列。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.3唯一性約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-22】創(chuàng)建goods2表,使goods_name具有唯一性約束。CREATETABLEgoods2(goods_idchar(6)NOTNULLPRIMARYKEY,goods_namevarchar(50)NOTNULLCONSTRAINTu_goods_nameUNIQUENONCLUSTERED,classification_idchar(6)NOTNULL,unit_pricemoneyNOTNULL,stock_quantityfloatNOTNULL,order_quantityfloat)8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.3唯一性約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-23】定義一個(gè)員工信息表employees,其中員工的身份證號emp_cardid列具有唯一性。CREATETABLEemployees(emp_idchar(8),emp_namechar(10),emp_cardidchar(18),CONSTRAINTpk_emp_idPRIMARYKEY(emp_id),CONSTRAINTuk_emp_cardidUNIQUE(emp_cardid))本例創(chuàng)建了表employees,同時(shí)顯式地定義了表級主鍵約束pk_emp_id和唯一性約束uk_emp_cardid。8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.4檢查約束
檢查(Check)約束對輸入列或整個(gè)表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫的數(shù)據(jù)完整性。當(dāng)對具有檢查約束列進(jìn)行插入或修改時(shí),SQLServer將用該檢查約束的邏輯表達(dá)式對新值進(jìn)行檢查,只有滿足條件(邏輯表達(dá)式返回TRUE)的值才能填入該列,否則報(bào)錯(cuò)。可為每列指定多個(gè)CHECK約束。例如,在employee表中,可以為sex(性別)列定義檢查約束,其邏輯表達(dá)式為:sex='男'ORsex='女'或sexIN('男','女')從而限制該列只能輸入“男”、“女”兩值之一。檢查約束的邏輯表達(dá)式可以使用當(dāng)前表的多列。例如,可以檢查約束的邏輯表達(dá)式為:DATEDIFF(year,Birth_Date,Hire_Date)>18該約束要求員工的雇用日期和出生日期這兩個(gè)日期數(shù)據(jù)在年份上的差距大于18(即確保不雇用18歲以下員工)。此時(shí),該檢查約束必須定義為表級。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.4檢查約束
定義檢查約束的語法格式如下:[CONSTRAINTconstraint_name]CHECK[NOTFORREPLICATION](logical_expression)各選項(xiàng)的含義如下:(1)NOTFORREPLICATION:指定檢查約束在把從其他表中復(fù)制的數(shù)據(jù)插入到表中時(shí)不發(fā)生作用。(2)logical_expression:指定檢查約束的邏輯表達(dá)式。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.4檢查約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-24】更改表employee2以添加未驗(yàn)證檢查約束。ALTERTABLEemployee2WITHNOCHECKADDCONSTRAINTCK_AgeCHECK(DATEDIFF(year,Birth_Date,Hire_Date)>18)本例向employee2表添加表級檢查約束以限制員工的聘用年齡必須大于18歲。利用WITHNOCHECK來防止對現(xiàn)有行驗(yàn)證約束,從而允許在存在違反約束的值的情況下添加該約束。8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.4檢查約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-25】創(chuàng)建一個(gè)訂貨表orders,保證各訂單的訂貨量必須不小于10。CREATETABLEorders(order_idchar(8),p_idchar(8),p_namechar(10),quantitysmallintCONSTRAINTchk_quantityCHECK(quantity>=10),CONSTRAINTpk_orders_idPRIMARYKEY(order_id))本例為列quantity定義了列級檢查約束,使其值必須大于等于10。8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.4檢查約束
8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性【例8-26】創(chuàng)建transporters表并定義檢查約束。CREATETABLEtransporters(transporter_idchar(4)NOTNULL,transport_namevarchar(50),linkman_namechar(8),addressvarchar(50),telephonechar(12)NOTNULLCHECK(telephoneLIKE'0[1-9][0-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9]'ORtelephoneLIKE'0[1-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'))注意:對計(jì)算列不能作為檢查約束外的任何約束。8.3使用約束實(shí)施數(shù)據(jù)完整性 8.3.5默認(rèn)約束
默認(rèn)(Default)約束通過定義列的默認(rèn)值或使用數(shù)據(jù)庫的默認(rèn)值對象綁定表的列,以確保在沒有為某列指定數(shù)據(jù)時(shí),來指定列的值。默認(rèn)值可以是常量,也可以是表達(dá)式,還可以為NULL值。當(dāng)給表列定義了Default約束后,在表中插入一條記錄時(shí),SQLServer會將該列的對應(yīng)位置填入默認(rèn)值。SQLServer推薦使用默認(rèn)約束,而不使用默認(rèn)值對象的方式來指定列的默認(rèn)值。8.1使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)施數(shù)據(jù)完整性8.3使用約束實(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 成都汽車租賃合同車輛安全檢查及保養(yǎng)協(xié)議
- 民航氣象考試題及答案
- 食堂配菜招投標(biāo)方案
- 中風(fēng)中經(jīng)絡(luò)的護(hù)理
- 2026版《全品高考》選考復(fù)習(xí)方案生物812 第27講 第2課時(shí) 其他植物激素、植物生長調(diào)節(jié)劑及影響植物生命活動調(diào)節(jié)的因素含答案
- 接待進(jìn)度管理方案(3篇)
- 2026版《全品高考》選考復(fù)習(xí)方案生物35 23.3神經(jīng)系統(tǒng)的分級調(diào)節(jié)及人腦的高級功能含答案
- 公益項(xiàng)目實(shí)施方案
- 小區(qū)店鋪投資選址方案
- 芯片現(xiàn)場采購方案
- GB/T 1796.1-2016輪胎氣門嘴第1部分:壓緊式內(nèi)胎氣門嘴
- (約克)機(jī)組熱回收技術(shù)
- (完整版)常見腫瘤AJCC分期手冊第八版(中文版)
- 托瑪琳養(yǎng)生碗gg課件
- 水產(chǎn)養(yǎng)殖示范基地建設(shè)項(xiàng)目實(shí)施方案
- 行政后勤人員 三級安全教育培訓(xùn)記錄卡
- 消化系統(tǒng)炎癥性腸病labc
- DB52∕T 1480-2019 GLW-8430連棟塑料薄膜溫室通用技術(shù)規(guī)范
- 醫(yī)院核心制度題庫(有答案)已修整(共48頁)
- 危險(xiǎn)源辨識與隱患排查全面講解
- 第9分冊并聯(lián)電容器組運(yùn)維細(xì)則(國網(wǎng)上海)
評論
0/150
提交評論