數(shù)據(jù)庫(kù)完整性_第1頁(yè)
數(shù)據(jù)庫(kù)完整性_第2頁(yè)
數(shù)據(jù)庫(kù)完整性_第3頁(yè)
數(shù)據(jù)庫(kù)完整性_第4頁(yè)
數(shù)據(jù)庫(kù)完整性_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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)境的不同,往往還需要一些特殊的約束條件。用戶(hù)定義的完整性即是針對(duì)某個(gè)特定關(guān)系數(shù)據(jù)庫(kù)的約束條件,它反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿(mǎn)足的語(yǔ)義要求。SQLServer提供了定義和檢驗(yàn)這類(lèi)完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)方法來(lái)處理它們,而不是用應(yīng)用程序來(lái)承擔(dān)這一功能。

SQLServer提供了一些工具來(lái)幫助用戶(hù)實(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)建索引,需要用戶(hù)手動(dòng)創(chuàng)建;用戶(hù)想要修改外部鍵約束的數(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ù);檢查約束中不能包含子查詢(xún)。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的字段上;如果字段定義為用戶(hù)定義的數(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í)必須指出要約束的那些列的名稱(chēng)。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是往用戶(hù)輸入記錄時(shí)沒(méi)有指定具體數(shù)據(jù)的列中自動(dòng)插入的數(shù)據(jù)。默認(rèn)值對(duì)象與ALTERTABLE或CREATETABLE命令操作表時(shí)用DEFAULT選項(xiàng)指定的缺省值功能相似,但默認(rèn)值對(duì)象可以用于多個(gè)列或用戶(hù)自定義數(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缺省值名稱(chēng)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ǔ)在表的列或用戶(hù)自定義數(shù)據(jù)類(lèi)型中的值的規(guī)定和限制。規(guī)則是單獨(dú)存儲(chǔ)的獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象。規(guī)則與其作用的表或用戶(hù)自定義數(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ī)則名稱(chēng)。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)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論