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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)庫完整性第一頁,共二十七頁,2022年,8月28日第9章

數(shù)據(jù)庫完整性不同的關(guān)系數(shù)據(jù)庫系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性即是針對某個特定關(guān)系數(shù)據(jù)庫的約束條件,它反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語義要求。SQLServer提供了定義和檢驗這類完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)方法來處理它們,而不是用應(yīng)用程序來承擔(dān)這一功能。

SQLServer提供了一些工具來幫助用戶實現(xiàn)數(shù)據(jù)完整性,其中最主要的是規(guī)則(Rule)、缺省值(Default)、約束(Constraint)和觸發(fā)器(Trigger)9.1約束9.2默認(rèn)值9.3規(guī)則本章首頁2

第二頁,共二十七頁,2022年,8月28日9.1約束

約束(Constraint)是MicrosoftSQLServer提供的自動保持?jǐn)?shù)據(jù)庫完整性的一種方法,定義了可輸入表或表的單個列中的數(shù)據(jù)的限制條件。

主鍵約束PRIMARYKEY

外關(guān)鍵字約束FOREIGNKEY

惟一性約束UNIQUE

檢查約束CHECK

缺省約束Default

列約束和表約束本節(jié)首頁3

第三頁,共二十七頁,2022年,8月28日9.1約束1.PRIMARYKEY約束

用于定義基本表的主鍵,它是惟一確定表中每一條記錄的標(biāo)識符,其值不能為NULL,也不能重復(fù),且IMAGE和TEXT類型的列不能被指定為主鍵,以此來保證實體的完整性。語法如下:CONSTRAINTconstraint_name PRIMARYKEY[CLUSTERED|NONCLUSTERED]

(column_name)4

第四頁,共二十七頁,2022年,8月28日9.1約束/*例9.1:test數(shù)據(jù)庫創(chuàng)建department表,指定dno為主鍵*/UsetestGoCreatetabledepartment/*部門表*/(dnointprimarykey,/*部門號,為主鍵*/dnamechar(20)/*部門名*/)Go本節(jié)首頁Createtabledepartment(dnoint,dnamechar(20),

CONSTRAINTPK_salary

primarykey(dno,dname))5

第五頁,共二十七頁,2022年,8月28日9.1約束

2.FOREIGNKEY約束

用于建立和加強(qiáng)兩個表數(shù)據(jù)之間的鏈接的一列或多列。外鍵約束用于強(qiáng)制參照完整性。當(dāng)一個表中的一列或多個列的組合和其它表中的主鍵定義相同時,就可以將這些列或列的組合定義為外鍵,并設(shè)定它適合哪個表中哪些列相關(guān)聯(lián)。外關(guān)鍵字約束的作用還體現(xiàn)在,當(dāng)向含有外關(guān)鍵字的表插入數(shù)據(jù)時,如果與之相關(guān)聯(lián)的表的列中無與插入的外關(guān)鍵字列值相同的值時,系統(tǒng)會拒絕插入數(shù)據(jù)。語法如下:CONSTRAINTconstraint_name FOREIGNKEY(column_name[,…n]) REFERENCESref_table[(ref_column[,…n])]6

第六頁,共二十七頁,2022年,8月28日9.1約束當(dāng)使用外部鍵約束時,應(yīng)該考慮以下幾個因素:外部鍵約束提供了字段參照完整性;外部鍵從句中的字段數(shù)目和每個字段指定的數(shù)據(jù)類型都必須和REFERENCES從句中的字段相匹配;外部鍵約束不能自動創(chuàng)建索引,需要用戶手動創(chuàng)建;用戶想要修改外部鍵約束的數(shù)據(jù),必須有對外部鍵約束所參考表的SELECT權(quán)限或者REFERENCES權(quán)限;參考同一表中的字段時,必須只使用REFERENCES子句,不能使用外部鍵子句;一個表中最多可以有31個外部鍵約束;在臨時表中,不能使用外部鍵約束;主鍵和外部鍵的數(shù)據(jù)類型必須嚴(yán)格匹配7

第七頁,共二十七頁,2022年,8月28日9.1約束/*例9.2:使用外鍵約束*/Use

testGoCreatetableworker(nointprimarykey,namechar(8),sexchar(2),dnoint/*部門編號*/ foreignkeyreferencesdepartment(dno) ondeletenoaction,/*刪除因錯誤失敗*/addresschar(30))Go本節(jié)首頁8

第八頁,共二十七頁,2022年,8月28日9.1約束3.UNIQUE約束

指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重復(fù)的值。語法如下:CONSTRAINTconstraint_name UNIQUE[CLUSTERED|NONCLUSTERED]--指定索引類別 (column_name[,…n])當(dāng)使用惟一性約束時,需要考慮以下幾個因素:使用惟一性約束的字段允許為空值;一個表中可以允許有多個惟一性約束;可以把惟一性約束定義在多個字段上;惟一性約束用于強(qiáng)制在指定字段上創(chuàng)建一個惟一性索引;默認(rèn)情況下,創(chuàng)建的索引類型為非聚集索引。9

第九頁,共二十七頁,2022年,8月28日9.1約束PRIMARYKEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別:①在一個基本表中只能定義一個PRIMARYKEY約束,但可定義多個UNIQUE約束;②對于指定為PRIMARYKEY的一個列或多個列的組合,其中任何一個列都不能出現(xiàn)空值,而對于UNIQUE所約束的唯一鍵,則允許為空。注意:不能為同一個列或一組列既定義UNIQUE約束,又定義PRIMARYKEY約束。PRIMARYKEY既可用于列約束,也可用于表約束。

10

第十頁,共二十七頁,2022年,8月28日9.1約束/*例9.3:test數(shù)據(jù)庫創(chuàng)建table5表,指定c1不含重復(fù)值*/UsetestGoCreatetabletable5(c1intunique,c2int)GoInserttable5values(1,100)GoInserttable5values(1,200)Go本節(jié)首頁11

第十一頁,共二十七頁,2022年,8月28日9.1約束

4.CHECK約束對輸入列或整個表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫的數(shù)據(jù)完整性。語法如下:CONSTRAINTconstraint_name CHECK[NOTFORREPLICATION] (logical_expression)當(dāng)使用檢查約束時,應(yīng)該考慮和注意以下幾點:一個列級檢查約束只能與限制的字段有關(guān);一個表級檢查約束只能與限制的表中字段有關(guān);一個表中可以定義多個檢查約束;每個CREATETABLE語句中每個字段只能定義一個檢查約束;在多個字段上定義檢查約束,則必須將檢查約束定義為表級約束;當(dāng)執(zhí)行INSERT語句或者UPDATE語句時,檢查約束將驗證數(shù)據(jù);檢查約束中不能包含子查詢。12

第十二頁,共二十七頁,2022年,8月28日9.1約束/*例9.4:test數(shù)據(jù)庫創(chuàng)建table6表,指定f2只能0-100分*/UsetestGoCreatetabletable6(f1int,f2intnotnullcheck(f2>=0andf2<=100))GoInserttable6values(1,120)Go本節(jié)首頁13

第十三頁,共二十七頁,2022年,8月28日9.1約束5.Default約束在插入操作中如果沒提供輸入值時,則系統(tǒng)自動指定值。默認(rèn)約束可以包括常量、函數(shù)、不帶變元的內(nèi)建函數(shù)或空值。語法如下:CONSTRAINTconstraint_name DEFAULTconstant_expression[FORcolumn_name]例:constraintde_order_quantitydefault100fororder_quantity使用默認(rèn)約束時,應(yīng)該注意以下幾點:每個字段只能定義一個默認(rèn)約束;如果定義的默認(rèn)值長于其對應(yīng)字段的允許長度,那么輸入到表中的默認(rèn)值將被截斷;不能加入到帶有IDENTITY屬性或者數(shù)據(jù)類型為timestamp的字段上;如果字段定義為用戶定義的數(shù)據(jù)類型,而且有一個默認(rèn)綁定到這個數(shù)據(jù)類型上,則不允許該字段有默認(rèn)約束。本節(jié)首頁14

第十四頁,共二十七頁,2022年,8月28日9.1約束6.列約束和表約束

列約束作為列定義的一部分只作用于此列本身。列約束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名。表約束作為表定義的一部分,可以作用于多個列。表約束與列定義相互獨立,不包括在列定義中,通常用于對多個列一起進(jìn)行約束,與列定義用’,’分隔,定義表約束時必須指出要約束的那些列的名稱。15

第十五頁,共二十七頁,2022年,8月28日9.1約束/*例9.5:test數(shù)據(jù)庫創(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é)首頁16

第十六頁,共二十七頁,2022年,8月28日9.2默認(rèn)值默認(rèn)值Default是往用戶輸入記錄時沒有指定具體數(shù)據(jù)的列中自動插入的數(shù)據(jù)。默認(rèn)值對象與ALTERTABLE或CREATETABLE命令操作表時用DEFAULT選項指定的缺省值功能相似,但默認(rèn)值對象可以用于多個列或用戶自定義數(shù)據(jù)類型。創(chuàng)建默認(rèn)對象綁定默認(rèn)對象重命名默認(rèn)對象解除默認(rèn)對象的綁定刪除默認(rèn)對象本章首頁17

第十七頁,共二十七頁,2022年,8月28日9.2默認(rèn)值在創(chuàng)建表時指定默認(rèn)值/*例9.6:test數(shù)據(jù)庫創(chuàng)建table8表,c2指定默認(rèn)值為當(dāng)前日期*/UsetestGoCreatetabletable8(c1int,c2datetimedefault(getdate()))GoInserttable8(c1)values(1)Select*fromtable8Go18

第十八頁,共二十七頁,2022年,8月28日9.2默認(rèn)值1.用CREATEDEFAULT命令創(chuàng)建默認(rèn)對象其語法如下:CREATEDEFAULTdefault_nameASconstant_expressiondefault_name缺省值名稱constant_expression可以是數(shù)學(xué)表達(dá)式或函數(shù),也可以包含表的列名或其它數(shù)據(jù)庫對象。例:創(chuàng)建con3默認(rèn)對象UsetestGoCreatedefaultcon3as10/*默認(rèn)值設(shè)置為10*/Go本節(jié)首頁19

第十九頁,共二十七頁,2022年,8月28日9.2默認(rèn)值2.綁定默認(rèn)對象其語法如下:sp_bindefault[@defname=]'default', [@objname=]'object_name' [,'futureonly']例:綁定默認(rèn)對象con3到test數(shù)據(jù)庫table8表的c1列上UsetestGoExecsp_bindefault'con3','table8.c1'Go本節(jié)首頁20

第二十頁,共二十七頁,2022年,8月28日9.2默認(rèn)值3.解除默認(rèn)對象的綁定其語法如下:Sp_unbindefault[@objname=]'object_name' [,'futureonly']例:解除test數(shù)據(jù)庫中table8表的c1列上的默認(rèn)對象綁定UsetestGoExecsp_unbindefault'table8.c1'Go本節(jié)首頁21

第二十一頁,共二十七頁,2022年,8月28日9.2默認(rèn)值4.刪除默認(rèn)對象其語法如下:DROPDEFAULT{default_name}[,...n]例:刪除默認(rèn)對象con3Use

testGoIfexists(selectnamefromsysobjects wherename='con3'andtype='D') dropdefaultcon3Go本節(jié)首頁22

第二十二頁,共二十七頁,2022年,8月28日9.3規(guī)則

規(guī)則(Rule)

就是數(shù)據(jù)庫中對存儲在表的列或用戶自定義數(shù)據(jù)類型中的值的規(guī)定和限制。規(guī)則是單獨存儲的獨立的數(shù)據(jù)庫對象。規(guī)則與其作用的表或用戶自定義數(shù)據(jù)類型是相互獨立的。規(guī)則和約束可以同時使用,表的列可以有一個規(guī)則及多個CHECK約束。創(chuàng)建規(guī)則

綁定規(guī)則

解除和刪除規(guī)則本章首頁23

第二十三頁,共二十七頁,2022年,8月28日9.3規(guī)則1.創(chuàng)建規(guī)則1)用企業(yè)管理器創(chuàng)建規(guī)則2)用CREATERULE命令創(chuàng)建規(guī)則語法格式為:CREATERULErule_nameAScondition_expressionrule_name規(guī)則名稱。condition_expression規(guī)則的定義,是能用于WHERE條件子句中的任何表達(dá)式,它可以包含算術(shù)運算符、關(guān)系運算符和謂詞(如IN、LIKE、BETWEEN等)。24

第二十四頁,共二十七頁,2022年,8月28日9.3規(guī)則例:限定輸入值在0~10之間。UsetestGoCreaterulerule1as@c1between0and10Go例:限定輸入值為2,5,8Createrulerul

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論