版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫(kù)完整性第一頁(yè),共二十七頁(yè),2022年,8月28日第9章
數(shù)據(jù)庫(kù)完整性不同的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性即是針對(duì)某個(gè)特定關(guān)系數(shù)據(jù)庫(kù)的約束條件,它反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語(yǔ)義要求。SQLServer提供了定義和檢驗(yàn)這類(lèi)完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)方法來(lái)處理它們,而不是用應(yīng)用程序來(lái)承擔(dān)這一功能。
SQLServer提供了一些工具來(lái)幫助用戶實(shí)現(xiàn)數(shù)據(jù)完整性,其中最主要的是規(guī)則(Rule)、缺省值(Default)、約束(Constraint)和觸發(fā)器(Trigger)9.1約束9.2默認(rèn)值9.3規(guī)則本章首頁(yè)2
第二頁(yè),共二十七頁(yè),2022年,8月28日9.1約束
約束(Constraint)是MicrosoftSQLServer提供的自動(dòng)保持?jǐn)?shù)據(jù)庫(kù)完整性的一種方法,定義了可輸入表或表的單個(gè)列中的數(shù)據(jù)的限制條件。
主鍵約束PRIMARYKEY
外關(guān)鍵字約束FOREIGNKEY
惟一性約束UNIQUE
檢查約束CHECK
缺省約束Default
列約束和表約束本節(jié)首頁(yè)3
第三頁(yè),共二十七頁(yè),2022年,8月28日9.1約束1.PRIMARYKEY約束
用于定義基本表的主鍵,它是惟一確定表中每一條記錄的標(biāo)識(shí)符,其值不能為NULL,也不能重復(fù),且IMAGE和TEXT類(lèi)型的列不能被指定為主鍵,以此來(lái)保證實(shí)體的完整性。語(yǔ)法如下:CONSTRAINTconstraint_name PRIMARYKEY[CLUSTERED|NONCLUSTERED]
(column_name)4
第四頁(yè),共二十七頁(yè),2022年,8月28日9.1約束/*例9.1:test數(shù)據(jù)庫(kù)創(chuàng)建department表,指定dno為主鍵*/UsetestGoCreatetabledepartment/*部門(mén)表*/(dnointprimarykey,/*部門(mén)號(hào),為主鍵*/dnamechar(20)/*部門(mén)名*/)Go本節(jié)首頁(yè)Createtabledepartment(dnoint,dnamechar(20),
CONSTRAINTPK_salary
primarykey(dno,dname))5
第五頁(yè),共二十七頁(yè),2022年,8月28日9.1約束
2.FOREIGNKEY約束
用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間的鏈接的一列或多列。外鍵約束用于強(qiáng)制參照完整性。當(dāng)一個(gè)表中的一列或多個(gè)列的組合和其它表中的主鍵定義相同時(shí),就可以將這些列或列的組合定義為外鍵,并設(shè)定它適合哪個(gè)表中哪些列相關(guān)聯(lián)。外關(guān)鍵字約束的作用還體現(xiàn)在,當(dāng)向含有外關(guān)鍵字的表插入數(shù)據(jù)時(shí),如果與之相關(guān)聯(lián)的表的列中無(wú)與插入的外關(guān)鍵字列值相同的值時(shí),系統(tǒng)會(huì)拒絕插入數(shù)據(jù)。語(yǔ)法如下:CONSTRAINTconstraint_name FOREIGNKEY(column_name[,…n]) REFERENCESref_table[(ref_column[,…n])]6
第六頁(yè),共二十七頁(yè),2022年,8月28日9.1約束當(dāng)使用外部鍵約束時(shí),應(yīng)該考慮以下幾個(gè)因素:外部鍵約束提供了字段參照完整性;外部鍵從句中的字段數(shù)目和每個(gè)字段指定的數(shù)據(jù)類(lèi)型都必須和REFERENCES從句中的字段相匹配;外部鍵約束不能自動(dòng)創(chuàng)建索引,需要用戶手動(dòng)創(chuàng)建;用戶想要修改外部鍵約束的數(shù)據(jù),必須有對(duì)外部鍵約束所參考表的SELECT權(quán)限或者REFERENCES權(quán)限;參考同一表中的字段時(shí),必須只使用REFERENCES子句,不能使用外部鍵子句;一個(gè)表中最多可以有31個(gè)外部鍵約束;在臨時(shí)表中,不能使用外部鍵約束;主鍵和外部鍵的數(shù)據(jù)類(lèi)型必須嚴(yán)格匹配7
第七頁(yè),共二十七頁(yè),2022年,8月28日9.1約束/*例9.2:使用外鍵約束*/Use
testGoCreatetableworker(nointprimarykey,namechar(8),sexchar(2),dnoint/*部門(mén)編號(hào)*/ foreignkeyreferencesdepartment(dno) ondeletenoaction,/*刪除因錯(cuò)誤失敗*/addresschar(30))Go本節(jié)首頁(yè)8
第八頁(yè),共二十七頁(yè),2022年,8月28日9.1約束3.UNIQUE約束
指定一個(gè)或多個(gè)列的組合的值具有惟一性,以防止在列中輸入重復(fù)的值。語(yǔ)法如下:CONSTRAINTconstraint_name UNIQUE[CLUSTERED|NONCLUSTERED]--指定索引類(lèi)別 (column_name[,…n])當(dāng)使用惟一性約束時(shí),需要考慮以下幾個(gè)因素:使用惟一性約束的字段允許為空值;一個(gè)表中可以允許有多個(gè)惟一性約束;可以把惟一性約束定義在多個(gè)字段上;惟一性約束用于強(qiáng)制在指定字段上創(chuàng)建一個(gè)惟一性索引;默認(rèn)情況下,創(chuàng)建的索引類(lèi)型為非聚集索引。9
第九頁(yè),共二十七頁(yè),2022年,8月28日9.1約束PRIMARYKEY與UNIQUE約束類(lèi)似,通過(guò)建立唯一索引來(lái)保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別:①在一個(gè)基本表中只能定義一個(gè)PRIMARYKEY約束,但可定義多個(gè)UNIQUE約束;②對(duì)于指定為PRIMARYKEY的一個(gè)列或多個(gè)列的組合,其中任何一個(gè)列都不能出現(xiàn)空值,而對(duì)于UNIQUE所約束的唯一鍵,則允許為空。注意:不能為同一個(gè)列或一組列既定義UNIQUE約束,又定義PRIMARYKEY約束。PRIMARYKEY既可用于列約束,也可用于表約束。
10
第十頁(yè),共二十七頁(yè),2022年,8月28日9.1約束/*例9.3:test數(shù)據(jù)庫(kù)創(chuàng)建table5表,指定c1不含重復(fù)值*/UsetestGoCreatetabletable5(c1intunique,c2int)GoInserttable5values(1,100)GoInserttable5values(1,200)Go本節(jié)首頁(yè)11
第十一頁(yè),共二十七頁(yè),2022年,8月28日9.1約束
4.CHECK約束對(duì)輸入列或整個(gè)表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性。語(yǔ)法如下:CONSTRAINTconstraint_name CHECK[NOTFORREPLICATION] (logical_expression)當(dāng)使用檢查約束時(shí),應(yīng)該考慮和注意以下幾點(diǎn):一個(gè)列級(jí)檢查約束只能與限制的字段有關(guān);一個(gè)表級(jí)檢查約束只能與限制的表中字段有關(guān);一個(gè)表中可以定義多個(gè)檢查約束;每個(gè)CREATETABLE語(yǔ)句中每個(gè)字段只能定義一個(gè)檢查約束;在多個(gè)字段上定義檢查約束,則必須將檢查約束定義為表級(jí)約束;當(dāng)執(zhí)行INSERT語(yǔ)句或者UPDATE語(yǔ)句時(shí),檢查約束將驗(yàn)證數(shù)據(jù);檢查約束中不能包含子查詢。12
第十二頁(yè),共二十七頁(yè),2022年,8月28日9.1約束/*例9.4:test數(shù)據(jù)庫(kù)創(chuàng)建table6表,指定f2只能0-100分*/UsetestGoCreatetabletable6(f1int,f2intnotnullcheck(f2>=0andf2<=100))GoInserttable6values(1,120)Go本節(jié)首頁(yè)13
第十三頁(yè),共二十七頁(yè),2022年,8月28日9.1約束5.Default約束在插入操作中如果沒(méi)提供輸入值時(shí),則系統(tǒng)自動(dòng)指定值。默認(rèn)約束可以包括常量、函數(shù)、不帶變?cè)膬?nèi)建函數(shù)或空值。語(yǔ)法如下:CONSTRAINTconstraint_name DEFAULTconstant_expression[FORcolumn_name]例:constraintde_order_quantitydefault100fororder_quantity使用默認(rèn)約束時(shí),應(yīng)該注意以下幾點(diǎn):每個(gè)字段只能定義一個(gè)默認(rèn)約束;如果定義的默認(rèn)值長(zhǎng)于其對(duì)應(yīng)字段的允許長(zhǎng)度,那么輸入到表中的默認(rèn)值將被截?cái)?;不能加入到帶有IDENTITY屬性或者數(shù)據(jù)類(lèi)型為timestamp的字段上;如果字段定義為用戶定義的數(shù)據(jù)類(lèi)型,而且有一個(gè)默認(rèn)綁定到這個(gè)數(shù)據(jù)類(lèi)型上,則不允許該字段有默認(rèn)約束。本節(jié)首頁(yè)14
第十四頁(yè),共二十七頁(yè),2022年,8月28日9.1約束6.列約束和表約束
列約束作為列定義的一部分只作用于此列本身。列約束是對(duì)某一個(gè)特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名。表約束作為表定義的一部分,可以作用于多個(gè)列。表約束與列定義相互獨(dú)立,不包括在列定義中,通常用于對(duì)多個(gè)列一起進(jìn)行約束,與列定義用’,’分隔,定義表約束時(shí)必須指出要約束的那些列的名稱。15
第十五頁(yè),共二十七頁(yè),2022年,8月28日9.1約束/*例9.5:test數(shù)據(jù)庫(kù)創(chuàng)建table7表,主鍵為c1和c2*/UsetestGoCreatetabletable7(c1int,c2int,c3char(5),c4char(10),constraintc1primarykey(c1,c2)/*表約束*/)GoInserttable7values(1,2,'ABC1','XYZ1')Inserttable7values(1,2,'ABC2','XYZ2')GoSelect*fromtable7Go本節(jié)首頁(yè)16
第十六頁(yè),共二十七頁(yè),2022年,8月28日9.2默認(rèn)值默認(rèn)值Default是往用戶輸入記錄時(shí)沒(méi)有指定具體數(shù)據(jù)的列中自動(dòng)插入的數(shù)據(jù)。默認(rèn)值對(duì)象與ALTERTABLE或CREATETABLE命令操作表時(shí)用DEFAULT選項(xiàng)指定的缺省值功能相似,但默認(rèn)值對(duì)象可以用于多個(gè)列或用戶自定義數(shù)據(jù)類(lèi)型。創(chuàng)建默認(rèn)對(duì)象綁定默認(rèn)對(duì)象重命名默認(rèn)對(duì)象解除默認(rèn)對(duì)象的綁定刪除默認(rèn)對(duì)象本章首頁(yè)17
第十七頁(yè),共二十七頁(yè),2022年,8月28日9.2默認(rèn)值在創(chuàng)建表時(shí)指定默認(rèn)值/*例9.6:test數(shù)據(jù)庫(kù)創(chuàng)建table8表,c2指定默認(rèn)值為當(dāng)前日期*/UsetestGoCreatetabletable8(c1int,c2datetimedefault(getdate()))GoInserttable8(c1)values(1)Select*fromtable8Go18
第十八頁(yè),共二十七頁(yè),2022年,8月28日9.2默認(rèn)值1.用CREATEDEFAULT命令創(chuàng)建默認(rèn)對(duì)象其語(yǔ)法如下:CREATEDEFAULTdefault_nameASconstant_expressiondefault_name缺省值名稱constant_expression可以是數(shù)學(xué)表達(dá)式或函數(shù),也可以包含表的列名或其它數(shù)據(jù)庫(kù)對(duì)象。例:創(chuàng)建con3默認(rèn)對(duì)象UsetestGoCreatedefaultcon3as10/*默認(rèn)值設(shè)置為10*/Go本節(jié)首頁(yè)19
第十九頁(yè),共二十七頁(yè),2022年,8月28日9.2默認(rèn)值2.綁定默認(rèn)對(duì)象其語(yǔ)法如下:sp_bindefault[@defname=]'default', [@objname=]'object_name' [,'futureonly']例:綁定默認(rèn)對(duì)象con3到test數(shù)據(jù)庫(kù)table8表的c1列上UsetestGoExecsp_bindefault'con3','table8.c1'Go本節(jié)首頁(yè)20
第二十頁(yè),共二十七頁(yè),2022年,8月28日9.2默認(rèn)值3.解除默認(rèn)對(duì)象的綁定其語(yǔ)法如下:Sp_unbindefault[@objname=]'object_name' [,'futureonly']例:解除test數(shù)據(jù)庫(kù)中table8表的c1列上的默認(rèn)對(duì)象綁定UsetestGoExecsp_unbindefault'table8.c1'Go本節(jié)首頁(yè)21
第二十一頁(yè),共二十七頁(yè),2022年,8月28日9.2默認(rèn)值4.刪除默認(rèn)對(duì)象其語(yǔ)法如下:DROPDEFAULT{default_name}[,...n]例:刪除默認(rèn)對(duì)象con3Use
testGoIfexists(selectnamefromsysobjects wherename='con3'andtype='D') dropdefaultcon3Go本節(jié)首頁(yè)22
第二十二頁(yè),共二十七頁(yè),2022年,8月28日9.3規(guī)則
規(guī)則(Rule)
就是數(shù)據(jù)庫(kù)中對(duì)存儲(chǔ)在表的列或用戶自定義數(shù)據(jù)類(lèi)型中的值的規(guī)定和限制。規(guī)則是單獨(dú)存儲(chǔ)的獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象。規(guī)則與其作用的表或用戶自定義數(shù)據(jù)類(lèi)型是相互獨(dú)立的。規(guī)則和約束可以同時(shí)使用,表的列可以有一個(gè)規(guī)則及多個(gè)CHECK約束。創(chuàng)建規(guī)則
綁定規(guī)則
解除和刪除規(guī)則本章首頁(yè)23
第二十三頁(yè),共二十七頁(yè),2022年,8月28日9.3規(guī)則1.創(chuàng)建規(guī)則1)用企業(yè)管理器創(chuàng)建規(guī)則2)用CREATERULE命令創(chuàng)建規(guī)則語(yǔ)法格式為:CREATERULErule_nameAScondition_expressionrule_name規(guī)則名稱。condition_expression規(guī)則的定義,是能用于WHERE條件子句中的任何表達(dá)式,它可以包含算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和謂詞(如IN、LIKE、BETWEEN等)。24
第二十四頁(yè),共二十七頁(yè),2022年,8月28日9.3規(guī)則例:限定輸入值在0~10之間。UsetestGoCreaterulerule1as@c1between0and10Go例:限定輸入值為2,5,8Createrulerul
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度虛擬現(xiàn)實(shí)內(nèi)容制作合作股權(quán)協(xié)議書(shū)3篇
- 二零二五年度農(nóng)村土地互換與農(nóng)村能源建設(shè)合作協(xié)議2篇
- 二零二五年度企業(yè)內(nèi)部停車(chē)場(chǎng)車(chē)輛停放服務(wù)責(zé)任協(xié)議3篇
- 2025年度職業(yè)教育辦學(xué)許可證轉(zhuǎn)讓及就業(yè)安置協(xié)議3篇
- 二零二五年度典當(dāng)物品鑒定與評(píng)估服務(wù)合同3篇
- 2025年度互聯(lián)網(wǎng)醫(yī)療加盟合作協(xié)議書(shū)3篇
- 二零二五年度互聯(lián)網(wǎng)公司員工離職保密與商業(yè)秘密保護(hù)更新協(xié)議2篇
- 2025年度內(nèi)河漁船出售轉(zhuǎn)讓與船舶交易資金監(jiān)管服務(wù)合同3篇
- 2025年度金融科技公司股東合伙人合作協(xié)議書(shū)3篇
- 二零二五年度房產(chǎn)轉(zhuǎn)讓背景下的環(huán)保責(zé)任協(xié)議3篇
- JavaScript教案課程設(shè)計(jì)
- 新改版教科版四年級(jí)下冊(cè)科學(xué)教學(xué)計(jì)劃
- 捷豹路虎發(fā)動(dòng)機(jī)規(guī)格-v6sc3.0升汽油機(jī)
- 肺炎試題及答案
- 中外教育簡(jiǎn)史知識(shí)點(diǎn)匯總
- T∕ZZB 2665-2022 免洗手消毒凝膠
- 化糞池計(jì)算表格Excel(自動(dòng)版)
- 2022年人美版美術(shù)六年級(jí)上冊(cè)教案全一冊(cè)
- 超外差調(diào)幅收音機(jī)課設(shè)報(bào)告——內(nèi)蒙古工業(yè)大學(xué)
- 3.2熔化和凝固-人教版八年級(jí)上冊(cè)課件(21張PPT)pptx
- 2017衢州新城吾悅廣場(chǎng)開(kāi)業(yè)安保方案
評(píng)論
0/150
提交評(píng)論