




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第13章數據完整性13.1數據完整性概念13.2數據約束13.3缺省與規則13.4約束與缺省、規則比較13.1數據完整性概念什么是數據庫的完整性數據庫的完整性是指數據的正確性和相容性正確性:數據是符合現實世界語義、反映當前實際狀況的。相容性:數據庫同一對象在不同關系表中的數據是符合邏輯的。數據庫完整性是防止不合語義或不正確的數據進入數據庫,體現了是否真實地反映現實世界
1.提供定義完整性約束條件的機制DBMS應提供定義數據庫完整性約束條件,并把它們存入數據庫中。2.提供完整性檢查的方法檢查數據是否滿足完整性約束條件的機制稱為完整性檢查。一般在INSERT、UPDATE、DELETE語句執行后開始檢查。3.違約處理DBMS若發現用戶的操作違背了完整性約束條件,就采取一定的動作以保證數據的完整性,如拒絕執行該操作,或級聯執行其他操作。DBMS維護數據庫完整性的機制:數據的完整性和安全性數據的完整性和安全性是兩個不同概念數據的完整性防止數據庫中存在不符合語義的數據,也就是防止數據庫中存在不正確的數據防范對象:不合語義的、不正確的數據數據的安全性保護數據庫防止惡意的破壞和非法的存取防范對象:非法用戶和非法操作完整性類型13.1.1實體完整性13.1.2參照完整性13.1.3用戶定義完整性SQL完整性組件域完整性:域完整性指列的值域的完整性。如數據類型、格式、值域范圍、是否允許空值等。13.1.1實體完整性規則檢查和違約處理SQLServer實現實體完整性的組件實體完整性規則規則1實體完整性規則(EntityIntegrity)若屬性A是基本關系R的主屬性,則屬性A不能取空值。例1:單列SAP(SUPERVISOR,SPECIALITY,POSTGRADUATE)POSTGRADUATE:主碼(假設研究生不會重名)不能取空值例2:多列SC(S#,C#,GRADE)屬性S#和C#都不能取空。實體完整性說明(1)實體完整性規則是針對基本關系而言的。一個基本表通常對應現實世界的一個實體集。(2)現實世界中的實體是可區分的,即它們具有某種唯一性標識。(3)關系模型中以主碼作為唯一性標識。(4)主碼中的屬性即主屬性不能取空值。主屬性取空值,就說明存在某個不可標識的實體,即存在不可區分的實體,這與第(2)點相矛盾,因此這個規則稱為實體完整性實體完整性檢查和違約處理插入或對主碼列進行更新操作時,DBMS按照實體完整性規則自動進行檢查。包括:1.檢查主碼值是否唯一,如果不唯一則拒絕插入或修改2.檢查主碼的各個屬性是否為空,只要有一個為空就拒絕插入或修改實體完整性檢查和違約處理(續)檢查記錄中主碼值是否唯一的一種方法是進行全表掃描實體完整性檢查和違約處理(續)在索引中檢查是否唯一。
SQL完整性組件SQLServer實現實體完整性的組件索引:聚集索引Unique約束:定義非空的唯一約束Primary約束:主鍵約束Identity屬性:自動增加Identity屬性語法IDENTITY[(seed,increment)]seed:加載到表中的第一個行所使用的值。increment:與前一個加載的行的標識值相加的增量值。必須同時指定種子和增量,或者二者都不指定。如果二者都未指定,則取默認值(1,1)舉例CREATETABLEnew_employees(id_numintIDENTITY(1,1),fnamevarchar(20),minitchar(1),lnamevarchar(30));13.1.2參照完整性關系間的引用外碼參照完整性規則1.關系間的引用在關系模型中實體及實體間的聯系都是用關系來描述的,因此可能存在著關系與關系間的引用。例1學生實體、專業實體
學生(學號,姓名,性別,專業號,年齡)專業(專業號,專業名)主碼主碼學生關系引用了專業關系的主碼“專業號”。學生關系中的“專業號”值必須是確實存在的專業的專業號,即專業關系中有該專業的記錄。關系間的引用(續)例2學生、課程、學生與課程之間的多對多聯系學生(學號,姓名,性別,專業號,年齡)課程(課程號,課程名,學分)選修(學號,課程號,成績)關系間的引用(續)例3學生實體及其內部的一對多聯系學生(學號,姓名,性別,專業號,年齡,班長)“學號”是主碼,“班長”是外碼,它引用了本關系的“學號”“班長”必須是確實存在的學生的學號2.外碼(ForeignKey)設F是基本關系R的一個或一組屬性,但不是關系R的碼。如果F與基本關系S的主碼Ks相對應,則稱F是基本關系R的外碼基本關系R稱為參照關系(ReferencingRelation)基本關系S稱為被參照關系(ReferencedRelation)或目標關系(TargetRelation)外碼(續)[例1]:學生關系的“專業號與專業關系的主碼“專業號”相對應“專業號”屬性是學生關系的外碼專業關系是被參照關系,學生關系為參照關系
外碼(續)[例2]:選修關系的“學號”與學生關系的主碼“學號”相對應選修關系的“課程號”與課程關系的主碼“課程號”相對應“學號”和“課程號”是選修關系的外碼學生關系和課程關系均為被參照關系選修關系為參照關系外碼(續)[例3]:“班長”與本身的主碼“學號”相對應“班長”是外碼學生關系既是參照關系也是被參照關系
外碼(續)關系R和S不一定是不同的關系目標關系S的主碼Ks和參照關系的外碼F必須定義在同一個(或一組)域上外碼并不一定要與相應的主碼同名當外碼與相應的主碼屬于不同關系時,往往取相同的名字,以便于識別3.參照完整性規則規則2.2參照完整性規則若屬性(或屬性組)F是基本關系R的外碼它與基本關系S的主碼Ks相對應(基本關系R和S不一定是不同的關系),則對于R中每個元組在F上的值必須為:或者取空值(F的每個屬性值均為空值)或者等于S中某個元組的主碼值
這條規則的實質是什么?“不允許引用不存在的實體”。參照完整性規則(續)[例1]:學生關系中每個元組的“專業號”屬性只取兩類值:(1)空值,表示尚未給該學生分配專業(2)非空值,這時該值必須是專業關系中某個元組的“專業號”值,表示該學生不可能分配一個不存在的專業參照完整性規則(續)〔例2〕:選修(學號,課程號,成績)“學號”和“課程號”可能的取值:(1)選修關系中的主屬性,不能取空值(2)只能取相應被參照關系中已經存在的主碼值參照完整性規則(續)例3〕:學生(學號,姓名,性別,專業號,年齡,班長)“班長”屬性值可以取兩類值:(1)空值,表示該學生所在班級尚未選出班長(2)非空值,該值必須是本關系中某個元組的學號值13.1.3用戶定義的完整性針對某一具體關系數據庫的約束條件,反映某一具體應用所涉及的數據必須滿足的語義要求關系模型應提供定義和檢驗這類完整性的機制,以便用統一的系統的方法處理它們,而不要由應用程序承擔這一功能13.2數據約束13.2.1列級約束與表級約束13.2.2主鍵約束13.2.3唯一約束13.2.4外鍵約束13.2.5缺省約束13.2.6CHECK約束13.2.7啟用和禁用約束使用sys.key_constraints目錄視圖
查看數據庫約束Friday,February3,2023第30頁13.2.1列級約束與表級約束列約束被指定為列定義的一部分,并且僅適用于指定的單個列。表約束的聲明與列的定義無關,可以適用于表中一個以上的列。當一個約束中必須包含一個以上的列時,必須使用表約束。例如,如果一個表的主鍵內有兩個或兩個以上的列,則必須使用表約束將這兩列加入主鍵內。列級約束與表級約束舉例CREATETABLEtable7(c1int, c2int, c3char(5), c4char(10), CONSTRAINTc1PRIMARYKEY(c1,c2))CREATETABLEdepartment/*部門表*/( dnointPRIMARYKEY,/*部門號,為主鍵*/ dnamechar(20), /*部門名*/)表級約束列級約束13.2.2主鍵約束作為表定義的一部分在創建表時創建。添加到還沒有PRIMARYKEY約束的表中(一個表只能有一個PRIMARYKEY約束)。如果已有PRIMARYKEY約束,則可對其進行修改或刪除。例如,可以使表的PRIMARYKEY約束引用其他列,更改列的順序、索引名、聚集選項或PRIMARYKEY約束的填充因子。定義了PRIMARYKEY約束的列的列寬不能更改。13.2.3唯一約束UNIQUEUNIQUE約束在列集內強制執行值的唯一性。對于UNIQUE約束中的列,表中不允許有兩行包含相同的非空值。主鍵也強制執行唯一性,但主鍵不允許空值,而且每個表中主鍵只能有一個,但是UNIQUE列卻可以有多個。UNIQUE約束優先于唯一索引。使用ALTERTABLE語句定義
UNIQUE約束在students表中,主鍵約束創建在studentID列上,如果這時還需要保證該表中的存儲身份證號的SSL列的數據是唯一的,可以使用UNIQUE約束。一般地,把UNIQUE約束稱為候選的主鍵約束。Friday,February3,2023第35頁13.2.4外鍵約束FOREIGNKEY約束稱為外鍵約束,用于標識表之間的關系,以強制參照完整性,即為表中一列或者多列數據提供參照完整性。一個表中最多可以有253個可以參照的表,因此每個表最多可以有253個FOREIGNKEY約束。在FOREIGNKEY約束中,只能參照同一個數據庫中的表,而不能參照其他數據庫中的表。FOREIGNKEY子句中的列數目和每個列指定的數據類型必須和REFERENCE子句中的列相同。FOREIGNKEY約束不能自動創建索引。參照同一個表中的列時,必須只使用REFERENCE子句,而不能使用FOREIGNKEY子句。在臨時表中,不能使用FOREIGNKEY約束。外鍵約束的基本語法形式在CREATETABLE語句中定義列的外鍵約束FOREIGNKEYREFERENCES外表名(參照列)ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}在ALTERTABLE語句中定義列的外鍵約束FOREIGNKEY(COLUMN)REFERENCES外表名(參照列)ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}在CREATETABLE語句中定義多列的外鍵約束FOREIGNKEY(COLUMN_list)REFERENCES外表名(參照列名表)ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}
USEtestGOCREATETABLEworker /*職工表*/( nointPRIMARYKEY, /*編號,為主鍵*/ namechar(8), /*姓名*/ sexchar(2), /*性別*/ dnoint /*部門號*/ FOREIGNKEYREFERENCESdepartment(dno) ONDELETENOACTION,/*刪除主鍵數據時外鍵表的行為*/ addresschar(30) /*地址*/)GO
該程序使用FOREIGNKEY子句在worker表中建立了一個刪除約束,即worker表的dno列(是一個外鍵)與department表的dno列關聯。如果外鍵表有數據,則刪除失敗,NOACTION是默認選項【例】在表定義時創建外鍵在ALTERTABLE語句中定義外鍵約束Friday,February3,2023第39頁13.2.5缺省約束DEFAULT缺省約束是加在列上的缺省值。缺省值是指當對列數據進行INSERT操作時系統自動提供的值。列的缺省約束值可以是常數或系統函數列的缺省約束值也可以是事先定義的缺省,在創建數據表的時候定義缺省約束時有兩種方法:用界面操作方便用命令操作需要兩步:第一步定義表結構,第二步綁定缺省列的缺省約束值是常數的情況CREATETABLEjsy_temp4(駕照號 int IDENTITY(1,1)NOTNULL PRIMARYKEYCLUSTERED, 姓名varchar(8) NOTNULL, 是否見習varchar(20)DEFAULT(‘是’), 身份證號char(18) NOTNULL UNIQUENONCLUSTERED)使用ALTERTABLE語句定義DEFAULT約束Friday,February3,2023第42頁13.2.6CHECK約束CHECK約束通過限制用戶輸入的值來加強域完整性。它指定應用于列中輸入的所有值的布爾(取值為TRUE或FALSE)搜索條件,拒絕所有不取值為TRUE的值。可以為每列指定多個CHECK約束。以下程序在test數據庫中創建一個table6表,其中使用CHECK約束來限定f2列只能為0~100分:
USEtestGOCREATETABLEtable6( f1int, f2intNOTNULLCHECK(f2>=0ANDf2<=100))GO當執行如下語句:
INSERTtable6VALUES(1,120)則會出現如圖13.2所示的錯誤消息。例:CHECK約束的使用方法13.2.7啟用和禁用約束(1)當建立主鍵約束或惟一約束時,SQLServer會在后臺自動建立惟一索引,并對表中的數據進行檢查,以確保數據符合約束要求,這種自查過程是無法關閉。(2)當創建檢查約束和外鍵約束時,在缺省狀態下,系統也會自動對數據進行檢查,與主鍵約束和惟一約束不同的是,它可以取消。當確認表中的數據已經符合約束條件時,就不必再浪費時間重復檢查。如果已確認表中的數據不符合約束條件,又不想馬上清理當前的數據,也不必對數據進行檢查,此時可以使用WITHNOCHECK選項關閉檢查當前數據。(3)當為某列加入一個新的缺省約束,SQLServer并不對該列已有數據進行檢查,表中已有記錄保留原有的取值或NULL。當新建一列同時指定其缺省值時,SQLServer才為已有記錄填充數值。如果使用了WITHVALUES選項,SQLServer會把缺省值賦給新列,否則新列為NULL。如果新列不允許為NULL,則無論是否指定了WITHVALUES選項,都使用缺省值。(4)當向數據庫添加大量的數據時,可以臨時禁止檢查約束和外鍵約束。使用WITHNOCHECK子句該約束對表中已有數據不強制檢查。但是,如果以后更新表中數據要檢查更新后的數據是否滿足約束。第46頁13.3缺省與規則SQLServer中缺省(默認值)和規則的概念缺省(默認值)是為列提供數據的一種方式,如果用戶進行INSERT操作時不為列輸入數據,則使用缺省值。規則是當用戶進行INSERT或UPDATE操作時,對輸入列中的數據設定的取值范圍。缺省與規則不是ANSI標準,一般不提倡使用,應盡可能使用約束,任何可以使用缺省與規則的地方都有可以使用約束。13.3缺省與規則特點(1)缺省與規則是數據庫對象,它們是獨立于表和列而建立的。(2)缺省與規則建立后與列或數據類型產生關聯,列和數據類型就具有了缺省與規則的屬性。(3)缺省與規則定義后,可以重復使用,可以綁定到多個列或數據類型上。(4)缺省與規則不隨表同時調入內存,當用到時才被調入內存,這可能會使程序執行出現延時。13.3缺省與規則13.3.1創建缺省和規則13.3.2綁定13.3.3取消綁定13.3.4刪除缺省和規則13.3.1創建缺省和規則CREATEDEFAULTdefault_nameASconstant_expression其中default_name為缺省值對象名,constant_expression為一個常量、數學表達式或內置函數,不能引用其列或別的數據庫對象。創建缺省舉例/*使用下面語句創建con3默認對象,其默認值為10*/createdefaultcon3as10go13.3.1創建缺省和規則CREATERULErule_nameASrule_conditions其中rule_name為規則對象名,rule_conditions為規則表達式,表示數據需滿足的條件。例:創建一個名為rule1的規則,限定輸入的值必須在0~10之間。
USEtestGOCREATERULErule1AS@c1BETWEEN0and10GO13.3.2綁定綁定到某列或用戶自定義的數據類型上,以便它們在數據輸入或修改操作中起作用。使用時要注意缺省和規則所用的數據類型必須與將要綁定的列數據類型一致,還要遵循已應用到該列中的約束。缺省和默認值綁定格式SP_BINDEFAULT‘default_name’,’object_name’[,FUTUREONLY]SP_BINDRULE‘rule_name’,‘object_name’,FUTUREONLY]1)default_name
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西安農村灌溉管理辦法
- 財政調研經費管理辦法
- 學校物資申請管理辦法
- 學校作業改革管理辦法
- 什么是面試培訓課件
- 創意繪畫培訓課件下載
- 東莞初中面試數學試卷
- 福州九上開門考數學試卷
- 大學英語拓展0-英美文化習俗之英國歷史文化舉要
- 廣東博羅縣期中數學試卷
- QBT 2155-2004 旅行箱包行業標準
- 免疫治療筆記
- (2024年)《甲亢病人的護理》ppt課件完整版
- T-CARM 002-2023 康復醫院建設標準
- 兒童發展心理學全套課件
- 2022水利工程生態護坡技術規范
- 《單片機C語言》課件
- 新能源與人工智能的融合發展
- 實驗室搬遷方案
- 人為因素航空安全管理
- 1、山東省專業技術職稱評審表(A3正反面手填)
評論
0/150
提交評論