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

下載本文檔

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

文檔簡(jiǎn)介

1、第第13章章 數(shù)據(jù)完整性數(shù)據(jù)完整性13.1 數(shù)據(jù)完整性概念數(shù)據(jù)完整性概念13.2 數(shù)據(jù)約束數(shù)據(jù)約束13.3 缺省與規(guī)則缺省與規(guī)則13.4 約束與缺省、規(guī)則比較約束與缺省、規(guī)則比較13.1 數(shù)據(jù)完整性概念數(shù)據(jù)完整性概念n什么是數(shù)據(jù)庫(kù)的完整性什么是數(shù)據(jù)庫(kù)的完整性n數(shù)據(jù)庫(kù)的完整性是指數(shù)據(jù)的正確性和相容性數(shù)據(jù)庫(kù)的完整性是指數(shù)據(jù)的正確性和相容性n正確性:數(shù)據(jù)是符合現(xiàn)實(shí)世界語(yǔ)義、反映當(dāng)前正確性:數(shù)據(jù)是符合現(xiàn)實(shí)世界語(yǔ)義、反映當(dāng)前實(shí)際狀況的。實(shí)際狀況的。n相容性:數(shù)據(jù)庫(kù)同一對(duì)象在不同關(guān)系表中的數(shù)相容性:數(shù)據(jù)庫(kù)同一對(duì)象在不同關(guān)系表中的數(shù)據(jù)是符合邏輯的。據(jù)是符合邏輯的。n數(shù)據(jù)庫(kù)完整性是防止不合語(yǔ)義或不正確的數(shù)數(shù)據(jù)

2、庫(kù)完整性是防止不合語(yǔ)義或不正確的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù),體現(xiàn)了是否真實(shí)地反映現(xiàn)實(shí)據(jù)進(jìn)入數(shù)據(jù)庫(kù),體現(xiàn)了是否真實(shí)地反映現(xiàn)實(shí)世界世界n 1.提供定義完整性約束條件的機(jī)制提供定義完整性約束條件的機(jī)制 DBMS應(yīng)提供定義數(shù)據(jù)庫(kù)完整性約束條件,并應(yīng)提供定義數(shù)據(jù)庫(kù)完整性約束條件,并把它們存入數(shù)據(jù)庫(kù)中。把它們存入數(shù)據(jù)庫(kù)中。n2.提供完整性檢查的方法提供完整性檢查的方法 檢查數(shù)據(jù)是否滿足完整性約束條件的機(jī)制稱(chēng)為檢查數(shù)據(jù)是否滿足完整性約束條件的機(jī)制稱(chēng)為完整性檢查。一般在完整性檢查。一般在INSERT、UPDATE、DELETE語(yǔ)句執(zhí)行后開(kāi)始檢查。語(yǔ)句執(zhí)行后開(kāi)始檢查。n3.違約處理違約處理 DBMS若發(fā)現(xiàn)用戶的操作違背了完

3、整性約束條若發(fā)現(xiàn)用戶的操作違背了完整性約束條件,就采取一定的動(dòng)作以保證數(shù)據(jù)的完整性,件,就采取一定的動(dòng)作以保證數(shù)據(jù)的完整性,如拒絕執(zhí)行該操作,或級(jí)聯(lián)執(zhí)行其他操作。如拒絕執(zhí)行該操作,或級(jí)聯(lián)執(zhí)行其他操作。DBMS維護(hù)數(shù)據(jù)庫(kù)完整性的機(jī)制:維護(hù)數(shù)據(jù)庫(kù)完整性的機(jī)制:數(shù)據(jù)的完整性和安全性數(shù)據(jù)的完整性和安全性n數(shù)據(jù)的完整性和安全性是兩個(gè)不同數(shù)據(jù)的完整性和安全性是兩個(gè)不同概念概念n數(shù)據(jù)的完整性數(shù)據(jù)的完整性防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義的數(shù)據(jù),也就是防止防止數(shù)據(jù)庫(kù)中存在不符合語(yǔ)義的數(shù)據(jù),也就是防止數(shù)據(jù)庫(kù)中存在不正確的數(shù)據(jù)數(shù)據(jù)庫(kù)中存在不正確的數(shù)據(jù)防范對(duì)象:不合語(yǔ)義的、不正確的數(shù)據(jù)防范對(duì)象:不合語(yǔ)義的、不正確的數(shù)據(jù)n數(shù)

4、據(jù)的安全性數(shù)據(jù)的安全性保護(hù)數(shù)據(jù)庫(kù)防止惡意的破壞和非法的存取保護(hù)數(shù)據(jù)庫(kù)防止惡意的破壞和非法的存取防范對(duì)象:非法用戶和非法操作防范對(duì)象:非法用戶和非法操作完整性類(lèi)型完整性類(lèi)型n13.1.1 實(shí)體完整性實(shí)體完整性n13.1.2 參照完整性參照完整性n13.1.3 用戶定義完整性用戶定義完整性SQL完整性組件完整性組件域完整性:域完整性指列的值域的完整性。如數(shù)據(jù)類(lèi)型、格式、域完整性:域完整性指列的值域的完整性。如數(shù)據(jù)類(lèi)型、格式、值域范圍、是否允許空值等。值域范圍、是否允許空值等。13.1.1 實(shí)體完整性實(shí)體完整性n規(guī)則規(guī)則n檢查和違約處理檢查和違約處理nSQL Server實(shí)現(xiàn)實(shí)體完整性的組件實(shí)現(xiàn)實(shí)體

5、完整性的組件實(shí)體完整性規(guī)則實(shí)體完整性規(guī)則規(guī)則規(guī)則1 實(shí)體完整性規(guī)則(實(shí)體完整性規(guī)則(Entity Integrity) 若屬性若屬性A是基本關(guān)系是基本關(guān)系R的的主屬性主屬性,則屬性,則屬性A不能取不能取空值空值。例例1:?jiǎn)危簡(jiǎn)瘟辛蠸AP (SUPERVISOR, SPECIALITY, POSTGRADUATE)POSTGRADUATE:主碼(假設(shè)研究生不會(huì)重名)不能取空:主碼(假設(shè)研究生不會(huì)重名)不能取空值值例例2 2:多列多列SC(S#,C#,GRADE) 屬性屬性S#和和C#都不能取空。都不能取空。實(shí)體完整性說(shuō)明實(shí)體完整性說(shuō)明(1) 實(shí)體完整性規(guī)則是針對(duì)基本關(guān)系而言的。一個(gè)基本表通實(shí)體完

6、整性規(guī)則是針對(duì)基本關(guān)系而言的。一個(gè)基本表通常對(duì)應(yīng)現(xiàn)實(shí)世界的一個(gè)實(shí)體集。常對(duì)應(yīng)現(xiàn)實(shí)世界的一個(gè)實(shí)體集。(2) 現(xiàn)實(shí)世界中的實(shí)體是可區(qū)分的,即它們具有某種唯一性現(xiàn)實(shí)世界中的實(shí)體是可區(qū)分的,即它們具有某種唯一性標(biāo)識(shí)。標(biāo)識(shí)。(3) 關(guān)系模型中以主碼作為唯一性標(biāo)識(shí)。關(guān)系模型中以主碼作為唯一性標(biāo)識(shí)。(4) 主碼中的屬性即主屬性不能取空值。主碼中的屬性即主屬性不能取空值。主屬性取空值,就說(shuō)明存在某個(gè)不可標(biāo)識(shí)的實(shí)體,即存主屬性取空值,就說(shuō)明存在某個(gè)不可標(biāo)識(shí)的實(shí)體,即存在不可區(qū)分的實(shí)體,這與第(在不可區(qū)分的實(shí)體,這與第(2)點(diǎn)相矛盾,因此這個(gè))點(diǎn)相矛盾,因此這個(gè)規(guī)則稱(chēng)為實(shí)體完整性規(guī)則稱(chēng)為實(shí)體完整性實(shí)體完整性檢查和

7、違約處理實(shí)體完整性檢查和違約處理n插入或?qū)χ鞔a列進(jìn)行更新操作時(shí),插入或?qū)χ鞔a列進(jìn)行更新操作時(shí),DBMS按照實(shí)體按照實(shí)體完整性規(guī)則自動(dòng)進(jìn)行檢查。包括:完整性規(guī)則自動(dòng)進(jìn)行檢查。包括:n1. 檢查主碼值是否唯一,如果不唯一則拒絕插入或修改檢查主碼值是否唯一,如果不唯一則拒絕插入或修改n2. 檢查主碼的各個(gè)屬性是否為空,只要有一個(gè)為空就拒檢查主碼的各個(gè)屬性是否為空,只要有一個(gè)為空就拒絕插入或修改絕插入或修改實(shí)體完整性檢查和違約處理實(shí)體完整性檢查和違約處理(續(xù)續(xù))n檢查記錄中主碼值是否唯一的一種方法是進(jìn)行檢查記錄中主碼值是否唯一的一種方法是進(jìn)行全全表掃描表掃描實(shí)體完整性檢查和違約處理實(shí)體完整性檢查和違約

8、處理(續(xù)續(xù))n在索引在索引中檢查是否唯一。中檢查是否唯一。 SQL完整性組件完整性組件nSQL Server實(shí)現(xiàn)實(shí)體完整性的組件實(shí)現(xiàn)實(shí)體完整性的組件n索引:聚集索引索引:聚集索引nUnique約束:定義非空的唯一約束約束:定義非空的唯一約束nPrimary約束:主鍵約束約束:主鍵約束nIdentity屬性屬性:自動(dòng)增加:自動(dòng)增加Identity屬性屬性n語(yǔ)法語(yǔ)法IDENTITY (seed , increment) nseed :加載到表中的第一個(gè)行所使用的值。:加載到表中的第一個(gè)行所使用的值。 nincrement :與前一個(gè)加載的行的標(biāo)識(shí)值相加的增量值。:與前一個(gè)加載的行的標(biāo)識(shí)值相加的增量

9、值。 n必須同時(shí)指定種子和增量,或者二者都不指定。必須同時(shí)指定種子和增量,或者二者都不指定。 如果如果二者都未指定,則取默認(rèn)值二者都未指定,則取默認(rèn)值 (1,1)n舉例舉例CREATE TABLE new_employees( id_num int IDENTITY (1,1), fname varchar (20), minit char(1), lname varchar(30);13.1.2 參照完整性參照完整性n關(guān)系間的引用關(guān)系間的引用n外碼外碼n參照完整性規(guī)則參照完整性規(guī)則1. 關(guān)系間的引用關(guān)系間的引用n在關(guān)系模型中實(shí)體及實(shí)體間的聯(lián)系都是用關(guān)系來(lái)在關(guān)系模型中實(shí)體及實(shí)體間的聯(lián)系都是用關(guān)

10、系來(lái)描述的,因此可能存在著關(guān)系與關(guān)系間的引用。描述的,因此可能存在著關(guān)系與關(guān)系間的引用。例例1 學(xué)生實(shí)體、專(zhuān)業(yè)實(shí)體學(xué)生實(shí)體、專(zhuān)業(yè)實(shí)體 學(xué)生(學(xué)生(學(xué)號(hào)學(xué)號(hào),姓名,性別,姓名,性別,專(zhuān)業(yè)號(hào),年齡),年齡) 專(zhuān)業(yè)(專(zhuān)業(yè)(專(zhuān)業(yè)號(hào),專(zhuān)業(yè)名),專(zhuān)業(yè)名)主碼主碼主碼主碼v學(xué)生關(guān)系引用了專(zhuān)業(yè)關(guān)系的主碼學(xué)生關(guān)系引用了專(zhuān)業(yè)關(guān)系的主碼“專(zhuān)業(yè)號(hào)專(zhuān)業(yè)號(hào)”。v 學(xué)生關(guān)系中的學(xué)生關(guān)系中的“專(zhuān)業(yè)號(hào)專(zhuān)業(yè)號(hào)”值必須是確實(shí)存在的專(zhuān)業(yè)的專(zhuān)業(yè)號(hào)值必須是確實(shí)存在的專(zhuān)業(yè)的專(zhuān)業(yè)號(hào) ,即,即專(zhuān)業(yè)專(zhuān)業(yè) 關(guān)系中有該專(zhuān)業(yè)的記錄。關(guān)系中有該專(zhuān)業(yè)的記錄。關(guān)系間的引用關(guān)系間的引用(續(xù)續(xù))例例2 學(xué)生、課程、學(xué)生與課程之間的多對(duì)多學(xué)生、課程、學(xué)生與課程之

11、間的多對(duì)多聯(lián)系聯(lián)系 學(xué)生(學(xué)生(學(xué)號(hào),姓名,性別,專(zhuān)業(yè)號(hào),年齡),姓名,性別,專(zhuān)業(yè)號(hào),年齡) 課程(課程(課程號(hào)課程號(hào),課程名,學(xué)分),課程名,學(xué)分) 選修(選修(學(xué)號(hào),課程號(hào)課程號(hào),成績(jī)),成績(jī))關(guān)系間的引用關(guān)系間的引用(續(xù)續(xù))例例3 學(xué)生實(shí)體及其內(nèi)部的一對(duì)多聯(lián)系學(xué)生實(shí)體及其內(nèi)部的一對(duì)多聯(lián)系 學(xué)生(學(xué)生(學(xué)號(hào)學(xué)號(hào),姓名,性別,專(zhuān)業(yè)號(hào),年齡,班長(zhǎng)),姓名,性別,專(zhuān)業(yè)號(hào),年齡,班長(zhǎng))學(xué)學(xué) 號(hào)號(hào)姓姓 名名性性 別別專(zhuān)專(zhuān) 業(yè)業(yè) 號(hào)號(hào)年年 齡齡班班 長(zhǎng)長(zhǎng)801張張 三三女女0119802802李李 四四男男0120803王王 五五男男0120802804趙趙 六六女女0220805805錢(qián)錢(qián) 七七男男

12、0219v“學(xué)號(hào)學(xué)號(hào)”是主碼,是主碼,“班長(zhǎng)班長(zhǎng)”是外碼,它引用了本關(guān)系的是外碼,它引用了本關(guān)系的“學(xué)號(hào)學(xué)號(hào)” v“班長(zhǎng)班長(zhǎng)” 必須是確實(shí)存在的學(xué)生的學(xué)號(hào)必須是確實(shí)存在的學(xué)生的學(xué)號(hào) 2外碼(外碼(Foreign Key)n設(shè)設(shè)F是基本關(guān)系是基本關(guān)系R的一個(gè)或一組屬性,但不是關(guān)系的一個(gè)或一組屬性,但不是關(guān)系R的碼。如果的碼。如果F與基本關(guān)系與基本關(guān)系S的主碼的主碼Ks相對(duì)應(yīng),則相對(duì)應(yīng),則稱(chēng)稱(chēng)F是基本關(guān)系是基本關(guān)系R的的外碼外碼n基本關(guān)系基本關(guān)系R稱(chēng)稱(chēng)為為參照關(guān)系參照關(guān)系(Referencing Relation)n基本關(guān)系基本關(guān)系S稱(chēng)稱(chēng)為為被參照關(guān)系被參照關(guān)系(Referenced Relati

13、on) 或或目標(biāo)關(guān)系目標(biāo)關(guān)系(Target Relation)外碼外碼(續(xù)續(xù))n例例1:學(xué)生關(guān)系的:學(xué)生關(guān)系的“專(zhuān)業(yè)號(hào)與專(zhuān)業(yè)關(guān)系的主專(zhuān)業(yè)號(hào)與專(zhuān)業(yè)關(guān)系的主碼碼“專(zhuān)業(yè)號(hào)專(zhuān)業(yè)號(hào)”相對(duì)應(yīng)相對(duì)應(yīng)n“專(zhuān)業(yè)號(hào)專(zhuān)業(yè)號(hào)”屬性是學(xué)生關(guān)系的外碼屬性是學(xué)生關(guān)系的外碼n專(zhuān)業(yè)關(guān)系是被參照關(guān)系,學(xué)生關(guān)系為參照關(guān)系專(zhuān)業(yè)關(guān)系是被參照關(guān)系,學(xué)生關(guān)系為參照關(guān)系 外碼外碼(續(xù)續(xù))n例例2: 選修關(guān)系的選修關(guān)系的“學(xué)號(hào)學(xué)號(hào)” 與學(xué)生關(guān)系的主碼與學(xué)生關(guān)系的主碼“學(xué)號(hào)學(xué)號(hào)”相對(duì)應(yīng)選修關(guān)系的相對(duì)應(yīng)選修關(guān)系的“課程號(hào)課程號(hào)”與課程關(guān)系的主碼與課程關(guān)系的主碼“課程號(hào)課程號(hào)”相對(duì)應(yīng)相對(duì)應(yīng)n“學(xué)號(hào)學(xué)號(hào)”和和“課程號(hào)課程號(hào)”是選修關(guān)系的外碼是選修關(guān)系

14、的外碼n學(xué)生關(guān)系和課程關(guān)系均為被參照關(guān)系學(xué)生關(guān)系和課程關(guān)系均為被參照關(guān)系n選修關(guān)系為參照關(guān)系選修關(guān)系為參照關(guān)系 外碼外碼(續(xù)續(xù))n例例3:“班長(zhǎng)班長(zhǎng)”與本身的主碼與本身的主碼“學(xué)號(hào)學(xué)號(hào)”相對(duì)應(yīng)相對(duì)應(yīng)n“班長(zhǎng)班長(zhǎng)”是外碼是外碼n學(xué)生關(guān)系既是參照關(guān)系也是被參照關(guān)系學(xué)生關(guān)系既是參照關(guān)系也是被參照關(guān)系 外碼外碼(續(xù)續(xù))n關(guān)系關(guān)系R和和S不一定是不同的關(guān)系不一定是不同的關(guān)系n目標(biāo)關(guān)系目標(biāo)關(guān)系S的主碼的主碼Ks 和參照關(guān)系的外碼和參照關(guān)系的外碼F必須定義必須定義在同一個(gè)(或一組)域上在同一個(gè)(或一組)域上n外碼并不一定要與相應(yīng)的主碼同名外碼并不一定要與相應(yīng)的主碼同名 當(dāng)外碼與相應(yīng)的主碼屬于不同關(guān)系時(shí),往往

15、取相當(dāng)外碼與相應(yīng)的主碼屬于不同關(guān)系時(shí),往往取相同的名字,以便于識(shí)別同的名字,以便于識(shí)別3. 參照完整性規(guī)則參照完整性規(guī)則規(guī)則規(guī)則2.2 參照完整性規(guī)則參照完整性規(guī)則 若屬性(或?qū)傩越M)若屬性(或?qū)傩越M)F是基本關(guān)系是基本關(guān)系R的外碼它與基的外碼它與基本關(guān)系本關(guān)系S的主碼的主碼Ks相對(duì)應(yīng)(基本關(guān)系相對(duì)應(yīng)(基本關(guān)系R和和S不一定不一定是不同的關(guān)系),則對(duì)于是不同的關(guān)系),則對(duì)于R中每個(gè)元組在中每個(gè)元組在F上的值上的值必須為:必須為:n或者取空值(或者取空值(F的每個(gè)屬性值均為空值)的每個(gè)屬性值均為空值)n或者等于或者等于S中某個(gè)元組的主碼值中某個(gè)元組的主碼值 這條規(guī)則的實(shí)質(zhì)是什么?這條規(guī)則的實(shí)質(zhì)是

16、什么? “不允許引用不存在的實(shí)體不允許引用不存在的實(shí)體”。參照完整性規(guī)則參照完整性規(guī)則(續(xù)續(xù))例例1:學(xué)生關(guān)系中每個(gè)元組的學(xué)生關(guān)系中每個(gè)元組的“專(zhuān)業(yè)號(hào)專(zhuān)業(yè)號(hào)”屬性只取兩類(lèi)屬性只取兩類(lèi)值:值:(1)空值空值,表示尚未給該學(xué)生分配專(zhuān)業(yè),表示尚未給該學(xué)生分配專(zhuān)業(yè)(2)非空值,這時(shí)該值必須)非空值,這時(shí)該值必須是專(zhuān)業(yè)關(guān)系中某個(gè)是專(zhuān)業(yè)關(guān)系中某個(gè)元組的元組的“專(zhuān)業(yè)號(hào)專(zhuān)業(yè)號(hào)”值值,表示該學(xué)生不可能分配,表示該學(xué)生不可能分配一個(gè)不存在的專(zhuān)業(yè)一個(gè)不存在的專(zhuān)業(yè)參照完整性規(guī)則參照完整性規(guī)則(續(xù)續(xù))例例2 :選修(選修(學(xué)號(hào)學(xué)號(hào),課程號(hào)課程號(hào),成績(jī)),成績(jī))“學(xué)號(hào)學(xué)號(hào)”和和“課程號(hào)課程號(hào)”可能的取值可能的取值 : (

17、1)選修關(guān)系中的主屬性,不能取空值)選修關(guān)系中的主屬性,不能取空值 (2)只能取相應(yīng)被參照關(guān)系中已經(jīng)存在的主碼值)只能取相應(yīng)被參照關(guān)系中已經(jīng)存在的主碼值參照完整性規(guī)則參照完整性規(guī)則(續(xù)續(xù))例例3:學(xué)生(學(xué)生(學(xué)號(hào)學(xué)號(hào),姓名,性別,專(zhuān)業(yè)號(hào),年齡,班長(zhǎng)),姓名,性別,專(zhuān)業(yè)號(hào),年齡,班長(zhǎng))“班長(zhǎng)班長(zhǎng)”屬性值可以取兩類(lèi)值:屬性值可以取兩類(lèi)值:(1)空值,表示該學(xué)生所在班級(jí)尚未選出班長(zhǎng))空值,表示該學(xué)生所在班級(jí)尚未選出班長(zhǎng)(2)非空值,該值必須是本關(guān)系中某個(gè)元組的學(xué)號(hào))非空值,該值必須是本關(guān)系中某個(gè)元組的學(xué)號(hào)值值13.1.3 用戶定義的完整性用戶定義的完整性n針對(duì)某一具體關(guān)系數(shù)據(jù)庫(kù)的約束條件,反針對(duì)某一

18、具體關(guān)系數(shù)據(jù)庫(kù)的約束條件,反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語(yǔ)義要求語(yǔ)義要求n關(guān)系模型應(yīng)提供定義和檢驗(yàn)這類(lèi)完整性的關(guān)系模型應(yīng)提供定義和檢驗(yàn)這類(lèi)完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)的方法處理它們,機(jī)制,以便用統(tǒng)一的系統(tǒng)的方法處理它們,而不要由應(yīng)用程序承擔(dān)這一功能而不要由應(yīng)用程序承擔(dān)這一功能13.2 數(shù)據(jù)約束數(shù)據(jù)約束n13.2.1 13.2.1 列級(jí)約束與表級(jí)約束列級(jí)約束與表級(jí)約束n13.2.2 13.2.2 主鍵約束主鍵約束n13.2.3 13.2.3 唯一約束唯一約束n13.2.4 13.2.4 外鍵約束外鍵約束n13.2.5 13.2.5 缺省約束缺省約束n

19、13.2.6 CHECK13.2.6 CHECK約束約束n13.2.7 13.2.7 啟用和禁用約束啟用和禁用約束使用使用sys.key_constraints目錄視圖目錄視圖查看數(shù)據(jù)庫(kù)約束查看數(shù)據(jù)庫(kù)約束2022年1月25日第30頁(yè)13.2.1 列級(jí)約束與表級(jí)約束n列約束被指定為列定義的一部分,并且僅列約束被指定為列定義的一部分,并且僅適用于指定的單個(gè)列。適用于指定的單個(gè)列。n表約束的聲明與列的定義無(wú)關(guān),可以適用表約束的聲明與列的定義無(wú)關(guān),可以適用于表中一個(gè)以上的列。于表中一個(gè)以上的列。n當(dāng)一個(gè)約束中必須包含一個(gè)以上的列時(shí),必須當(dāng)一個(gè)約束中必須包含一個(gè)以上的列時(shí),必須使用表約束。例如,如果一個(gè)

20、表的主鍵內(nèi)有兩使用表約束。例如,如果一個(gè)表的主鍵內(nèi)有兩個(gè)或兩個(gè)以上的列,則必須使用表約束將這兩個(gè)或兩個(gè)以上的列,則必須使用表約束將這兩列加入主鍵內(nèi)。列加入主鍵內(nèi)。列級(jí)約束與表級(jí)約束舉例CREATE TABLE table7 ( c1 int, c2 int, c3 char(5), c4 char(10),CONSTRAINT c1 PRIMARY KEY(c1,c2)CREATE TABLE department /*部門(mén)表部門(mén)表*/( dno int PRIMARY KEY, /*部門(mén)號(hào)部門(mén)號(hào),為主鍵為主鍵*/ dname char(20), /*部門(mén)名部門(mén)名*/)表級(jí)約束表級(jí)約束列級(jí)約束

21、列級(jí)約束13.2.2 主鍵約束n作為表定義的一部分在創(chuàng)建表時(shí)創(chuàng)建。作為表定義的一部分在創(chuàng)建表時(shí)創(chuàng)建。n添加到還沒(méi)有添加到還沒(méi)有PRIMARY KEY約束的表中(一個(gè)約束的表中(一個(gè)表只能有一個(gè)表只能有一個(gè)PRIMARY KEY約束)。約束)。n如果已有如果已有PRIMARY KEY約束,則可對(duì)其進(jìn)行修約束,則可對(duì)其進(jìn)行修改或刪除。例如,可以使表的改或刪除。例如,可以使表的PRIMARY KEY約約束引用其他列,更改列的順序、索引名、聚集選束引用其他列,更改列的順序、索引名、聚集選項(xiàng)或項(xiàng)或PRIMARY KEY約束的填充因子。定義了約束的填充因子。定義了PRIMARY KEY約束的列的列寬不能更

22、改。約束的列的列寬不能更改。13.2.3 唯一約束 UNIQUEnUNIQUE約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一性。對(duì)于性。對(duì)于UNIQUE約束中的列,表中不允約束中的列,表中不允許有兩行包含相同的非空值。主鍵也強(qiáng)制許有兩行包含相同的非空值。主鍵也強(qiáng)制執(zhí)行唯一性,但主鍵不允許空值,而且每執(zhí)行唯一性,但主鍵不允許空值,而且每個(gè)表中主鍵只能有一個(gè),但是個(gè)表中主鍵只能有一個(gè),但是UNIQUE列列卻可以有多個(gè)。卻可以有多個(gè)。nUNIQUE約束優(yōu)先于唯一索引。約束優(yōu)先于唯一索引。使用使用ALTER TABLE語(yǔ)句定義語(yǔ)句定義UNIQUE約束約束n在students表中,主鍵約束創(chuàng)建

23、在studentID列上,如果這時(shí)還需要保證該表中的存儲(chǔ)身份證號(hào)的SSL列的數(shù)據(jù)是唯一的,可以使用UNIQUE約束。一般地,把UNIQUE約束稱(chēng)為候選的主鍵約束。2022年1月25日第35頁(yè)13.2.4 外鍵約束 nFOREIGN KEY約束稱(chēng)為外鍵約束,用于標(biāo)識(shí)表之間的關(guān)約束稱(chēng)為外鍵約束,用于標(biāo)識(shí)表之間的關(guān)系,以強(qiáng)制參照完整性,即為表中一列或者多列數(shù)據(jù)提供系,以強(qiáng)制參照完整性,即為表中一列或者多列數(shù)據(jù)提供參照完整性。參照完整性。n一個(gè)表中最多可以有一個(gè)表中最多可以有253個(gè)可以參照的表,因此每個(gè)表最多個(gè)可以參照的表,因此每個(gè)表最多可以有可以有253個(gè)個(gè)FOREIGN KEY約束。約束。n在在

24、FOREIGN KEY約束中,只能參照同一個(gè)數(shù)據(jù)庫(kù)中的表,約束中,只能參照同一個(gè)數(shù)據(jù)庫(kù)中的表,而不能參照其他數(shù)據(jù)庫(kù)中的表。而不能參照其他數(shù)據(jù)庫(kù)中的表。nFOREIGN KEY子句中的列數(shù)目和每個(gè)列指定的數(shù)據(jù)類(lèi)型子句中的列數(shù)目和每個(gè)列指定的數(shù)據(jù)類(lèi)型必須和必須和REFERENCE子句中的列相同。子句中的列相同。nFOREIGN KEY約束不能自動(dòng)創(chuàng)建索引。約束不能自動(dòng)創(chuàng)建索引。n參照同一個(gè)表中的列時(shí),必須只使用參照同一個(gè)表中的列時(shí),必須只使用REFERENCE子句,子句,而不能使用而不能使用FOREIGN KEY子句。子句。n在臨時(shí)表中,不能使用在臨時(shí)表中,不能使用FOREIGN KEY約束。約束

25、。外鍵約束的基本語(yǔ)法形式外鍵約束的基本語(yǔ)法形式n在在CREATE TABLE語(yǔ)句中定義列的外鍵約束語(yǔ)句中定義列的外鍵約束FOREIGN KEY REFERENCES 外表名(參照列)外表名(參照列) ON DELETE NO ACTION|CASCADE|SET NULL| SET DEFAULT ON UPDATE NO ACTION|CASCADE|SET NULL| SET DEFAULTn在在ALTER TABLE語(yǔ)句中定義列的外鍵約束語(yǔ)句中定義列的外鍵約束FOREIGN KEY (COLUMN) REFERENCES 外表名(參照列)外表名(參照列) ON DELETE NO ACT

26、ION|CASCADE|SET NULL| SET DEFAULT ON UPDATE NO ACTION|CASCADE|SET NULL| SET DEFAULTn在在CREATE TABLE語(yǔ)句中定義多列的外鍵約束語(yǔ)句中定義多列的外鍵約束FOREIGN KEY (COLUMN_list) REFERENCES 外表名(參照列名表)外表名(參照列名表) ON DELETE NO ACTION|CASCADE|SET NULL| SET DEFAULT ON UPDATE NO ACTION|CASCADE|SET NULL| SET DEFAULTUSE testGOCREATE TABL

27、E worker/*職工表職工表*/(no int PRIMARY KEY, /*編號(hào)編號(hào),為主鍵為主鍵*/name char(8),/*姓名姓名*/sex char(2),/*性別性別*/dno int /*部門(mén)號(hào)部門(mén)號(hào)*/FOREIGN KEY REFERENCES department(dno)ON DELETE NO ACTION, /*刪除主鍵數(shù)據(jù)時(shí)外鍵表的行為刪除主鍵數(shù)據(jù)時(shí)外鍵表的行為*/address char(30)/*地址地址*/)GO該程序使用該程序使用FOREIGN KEY子句在子句在worker表中建立了表中建立了一個(gè)刪除約束,即一個(gè)刪除約束,即worker表的表的dn

28、o列(是一個(gè)外鍵)與列(是一個(gè)外鍵)與department表的表的dno列關(guān)聯(lián)。如果外鍵表有數(shù)據(jù),則刪除失列關(guān)聯(lián)。如果外鍵表有數(shù)據(jù),則刪除失敗,敗, NO ACTION是默認(rèn)選項(xiàng)是默認(rèn)選項(xiàng)【例】 在表定義時(shí)創(chuàng)建外鍵在表定義時(shí)創(chuàng)建外鍵在在ALTER TABLE語(yǔ)句中定義外語(yǔ)句中定義外鍵約束鍵約束2022年1月25日第39頁(yè)13.2.5 缺省約束 DEFAULTn缺省約束是加在列上的缺省值。缺省值是指當(dāng)對(duì)缺省約束是加在列上的缺省值。缺省值是指當(dāng)對(duì)列數(shù)據(jù)進(jìn)行列數(shù)據(jù)進(jìn)行 INSERT操作時(shí)系統(tǒng)自動(dòng)提供的值。操作時(shí)系統(tǒng)自動(dòng)提供的值。n列的缺省約束值可以是常數(shù)或系統(tǒng)函數(shù)列的缺省約束值可以是常數(shù)或系統(tǒng)函數(shù)n

29、列的缺省約束值也可以是事先定義的缺省,在創(chuàng)列的缺省約束值也可以是事先定義的缺省,在創(chuàng)建數(shù)據(jù)表的時(shí)候定義缺省約束時(shí)有兩種方法:建數(shù)據(jù)表的時(shí)候定義缺省約束時(shí)有兩種方法:n用界面操作方便用界面操作方便n用命令操作需要兩步:第一步定義表結(jié)構(gòu),第二步綁用命令操作需要兩步:第一步定義表結(jié)構(gòu),第二步綁定缺省定缺省列的缺省約束值是常數(shù)的情況CREATE TABLEjsy_temp4 (駕照號(hào)駕照號(hào)intIDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,姓名姓名 varchar(8) NOT NULL,是否見(jiàn)習(xí)是否見(jiàn)習(xí) varchar(20) DEFAULT(是是),身份

30、證號(hào)身份證號(hào) char(18) NOT NULL UNIQUE NONCLUSTERED)使用使用ALTER TABLE語(yǔ)句定義語(yǔ)句定義DEFAULT約束約束2022年1月25日第42頁(yè)13.2.6 CHECK約束nCHECK約束通過(guò)限制用戶輸入的值來(lái)約束通過(guò)限制用戶輸入的值來(lái)加強(qiáng)域完整性。它指定應(yīng)用于列中輸入的加強(qiáng)域完整性。它指定應(yīng)用于列中輸入的所有值的布爾(取值為所有值的布爾(取值為T(mén)RUE或或FALSE)搜)搜索條件,拒絕所有不取值為索條件,拒絕所有不取值為T(mén)RUE的值??傻闹怠?梢詾槊苛兄付ǘ鄠€(gè)以為每列指定多個(gè)CHECK約束。約束。以下程序在以下程序在test數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)中創(chuàng)

31、建一個(gè)table6表,其中使用表,其中使用CHECK約束來(lái)限定約束來(lái)限定f2列只能為列只能為0100分:分:USE testGOCREATE TABLE table6(f1 int,f2 int NOT NULL CHECK(f2=0 AND f2=100)GO當(dāng)執(zhí)行如下語(yǔ)句:當(dāng)執(zhí)行如下語(yǔ)句:INSERT table6 VALUES(1,120)則會(huì)出現(xiàn)如圖則會(huì)出現(xiàn)如圖13.2所示的錯(cuò)誤消息。所示的錯(cuò)誤消息。例例: CHECK約束的使用方法約束的使用方法13.2.7 啟用和禁用約束n(1)當(dāng)建立主鍵約束或惟一約束時(shí),)當(dāng)建立主鍵約束或惟一約束時(shí),SQL Server會(huì)在后臺(tái)自動(dòng)建立惟會(huì)在后臺(tái)自

32、動(dòng)建立惟一索引,并對(duì)表中的數(shù)據(jù)進(jìn)行檢查,以確保數(shù)據(jù)符合約束要求,這種一索引,并對(duì)表中的數(shù)據(jù)進(jìn)行檢查,以確保數(shù)據(jù)符合約束要求,這種自查過(guò)程是無(wú)法關(guān)閉。自查過(guò)程是無(wú)法關(guān)閉。n(2)當(dāng)創(chuàng)建檢查約束和外鍵約束時(shí),在缺省狀態(tài)下,系統(tǒng)也會(huì)自動(dòng))當(dāng)創(chuàng)建檢查約束和外鍵約束時(shí),在缺省狀態(tài)下,系統(tǒng)也會(huì)自動(dòng)對(duì)數(shù)據(jù)進(jìn)行檢查,與主鍵約束和惟一約束不同的是,它可以取消。當(dāng)對(duì)數(shù)據(jù)進(jìn)行檢查,與主鍵約束和惟一約束不同的是,它可以取消。當(dāng)確認(rèn)表中的數(shù)據(jù)已經(jīng)符合約束條件時(shí),就不必再浪費(fèi)時(shí)間重復(fù)檢查。確認(rèn)表中的數(shù)據(jù)已經(jīng)符合約束條件時(shí),就不必再浪費(fèi)時(shí)間重復(fù)檢查。如果已確認(rèn)表中的數(shù)據(jù)不符合約束條件,又不想馬上清理當(dāng)前的數(shù)據(jù),如果已確認(rèn)表

33、中的數(shù)據(jù)不符合約束條件,又不想馬上清理當(dāng)前的數(shù)據(jù),也不必對(duì)數(shù)據(jù)進(jìn)行檢查,此時(shí)可以使用也不必對(duì)數(shù)據(jù)進(jìn)行檢查,此時(shí)可以使用WITH NOCHECK選項(xiàng)關(guān)閉選項(xiàng)關(guān)閉檢查當(dāng)前數(shù)據(jù)。檢查當(dāng)前數(shù)據(jù)。n(3)當(dāng)為某列加入一個(gè)新的缺省約束,)當(dāng)為某列加入一個(gè)新的缺省約束,SQL Server 并不對(duì)該列已有并不對(duì)該列已有數(shù)據(jù)進(jìn)行檢查,表中已有記錄保留原有的取值或數(shù)據(jù)進(jìn)行檢查,表中已有記錄保留原有的取值或NULL。當(dāng)新建一列。當(dāng)新建一列同時(shí)指定其缺省值時(shí),同時(shí)指定其缺省值時(shí),SQL Server才為已有記錄填充數(shù)值。如果使用才為已有記錄填充數(shù)值。如果使用了了WITH VALUES選項(xiàng),選項(xiàng),SQL Server

34、會(huì)把缺省值賦給新列,否則新列會(huì)把缺省值賦給新列,否則新列為為NULL。如果新列不允許為。如果新列不允許為NULL ,則無(wú)論是否指定了,則無(wú)論是否指定了WITH VALUES選項(xiàng),都使用缺省值。選項(xiàng),都使用缺省值。n(4)當(dāng)向數(shù)據(jù)庫(kù)添加大量的數(shù)據(jù)時(shí),可以臨時(shí)禁止檢查約束和外鍵)當(dāng)向數(shù)據(jù)庫(kù)添加大量的數(shù)據(jù)時(shí),可以臨時(shí)禁止檢查約束和外鍵約束。約束。使用使用WITH NOCHECK子句子句n該約束對(duì)表中已有數(shù)據(jù)不強(qiáng)制檢查。但是,如果該約束對(duì)表中已有數(shù)據(jù)不強(qiáng)制檢查。但是,如果以后更新表中數(shù)據(jù)要檢查更新后的數(shù)據(jù)是否滿足以后更新表中數(shù)據(jù)要檢查更新后的數(shù)據(jù)是否滿足約束。約束。第46頁(yè)13.3 缺省與規(guī)則缺省與規(guī)

35、則 nSQLServer中缺省(默認(rèn)值)和規(guī)則的概念中缺?。J(rèn)值)和規(guī)則的概念n缺?。J(rèn)值)是為列提供數(shù)據(jù)的一種方式,如果缺?。J(rèn)值)是為列提供數(shù)據(jù)的一種方式,如果用戶進(jìn)行用戶進(jìn)行INSERT操作時(shí)不為列輸入數(shù)據(jù),則使用操作時(shí)不為列輸入數(shù)據(jù),則使用缺省值。缺省值。n規(guī)則是當(dāng)用戶進(jìn)行規(guī)則是當(dāng)用戶進(jìn)行INSERT或或UPDATE操作時(shí),對(duì)操作時(shí),對(duì)輸入列中的數(shù)據(jù)設(shè)定的取值范圍。輸入列中的數(shù)據(jù)設(shè)定的取值范圍。n缺省與規(guī)則不是缺省與規(guī)則不是ANSI標(biāo)準(zhǔn),一般不提倡使用,標(biāo)準(zhǔn),一般不提倡使用,應(yīng)盡可能使用約束,任何可以使用缺省與規(guī)則應(yīng)盡可能使用約束,任何可以使用缺省與規(guī)則的地方都有可以使用約束。的

36、地方都有可以使用約束。13.3 缺省與規(guī)則缺省與規(guī)則 n特點(diǎn)特點(diǎn)(1)缺省與規(guī)則是數(shù)據(jù)庫(kù)對(duì)象,它們是獨(dú)立于表和列而缺省與規(guī)則是數(shù)據(jù)庫(kù)對(duì)象,它們是獨(dú)立于表和列而建立的。建立的。(2)缺省與規(guī)則建立后與列或數(shù)據(jù)類(lèi)型產(chǎn)生關(guān)聯(lián),列和缺省與規(guī)則建立后與列或數(shù)據(jù)類(lèi)型產(chǎn)生關(guān)聯(lián),列和數(shù)據(jù)類(lèi)型就具有了缺省與規(guī)則的屬性。數(shù)據(jù)類(lèi)型就具有了缺省與規(guī)則的屬性。(3)缺省與規(guī)則定義后,可以重復(fù)使用,可以綁定到多缺省與規(guī)則定義后,可以重復(fù)使用,可以綁定到多個(gè)列或數(shù)據(jù)類(lèi)型上。個(gè)列或數(shù)據(jù)類(lèi)型上。(4)缺省與規(guī)則不隨表同時(shí)調(diào)入內(nèi)存,當(dāng)用到時(shí)才被調(diào)缺省與規(guī)則不隨表同時(shí)調(diào)入內(nèi)存,當(dāng)用到時(shí)才被調(diào)入內(nèi)存,這可能會(huì)使程序執(zhí)行出現(xiàn)延時(shí)。入內(nèi)

37、存,這可能會(huì)使程序執(zhí)行出現(xiàn)延時(shí)。13.3 缺省與規(guī)則缺省與規(guī)則 n13.3.1 創(chuàng)建缺省和規(guī)則創(chuàng)建缺省和規(guī)則n13.3.2 綁定綁定n13.3.3 取消綁定取消綁定n13.3.4 刪除缺省和規(guī)則刪除缺省和規(guī)則13.3.1 創(chuàng)建缺省和規(guī)則CREATE DEFAULT default_name AS constant_expression其中其中default_name為缺省值對(duì)象名,為缺省值對(duì)象名, constant_expression為一個(gè)常量、數(shù)學(xué)表達(dá)式為一個(gè)常量、數(shù)學(xué)表達(dá)式或內(nèi)置函數(shù),不能引用其列或別的數(shù)據(jù)庫(kù)對(duì)象?;騼?nèi)置函數(shù),不能引用其列或別的數(shù)據(jù)庫(kù)對(duì)象。創(chuàng)建缺省舉例創(chuàng)建缺省舉例/*使用

38、下面語(yǔ)句創(chuàng)建使用下面語(yǔ)句創(chuàng)建con3默認(rèn)對(duì)象默認(rèn)對(duì)象,其默認(rèn)值為其默認(rèn)值為10 */create default con3 as 10go13.3.1 創(chuàng)建缺省和規(guī)則CREATE RULE rule_name AS rule_conditionsn其中rule_name為規(guī)則對(duì)象名,rule_conditions為規(guī)則表達(dá)式,表示數(shù)據(jù)需滿足的條件。例:創(chuàng)建一個(gè)名為例:創(chuàng)建一個(gè)名為rule1的規(guī)則,限定輸入的值必須在的規(guī)則,限定輸入的值必須在010之間。之間。USE test GO CREATE RULE rule1 AS c1 BETWEEN 0 and 10 GO13.3.2 綁定n綁定到綁定到某列或用戶自定義某列或用戶自定義的數(shù)據(jù)類(lèi)型上,的數(shù)據(jù)類(lèi)型上,以便它們?cè)跀?shù)據(jù)輸入或修改操作中起作用。以便它們?cè)跀?shù)據(jù)輸入或修改操作中起作用。n使用時(shí)要注意缺省和規(guī)則所用的數(shù)據(jù)類(lèi)型使用時(shí)要注

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論