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

下載本文檔

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

文檔簡介

第三章數(shù)據(jù)庫完整性和索引3.1數(shù)據(jù)完整性的概述一、數(shù)據(jù)完整性的定義數(shù)據(jù)完整性(DataIntegrity)是指數(shù)據(jù)的精確性和可靠性。定義數(shù)據(jù)完整性的目的:

1、防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù);

2、防止錯誤信息的輸入和輸出而造成無效操作;3.1數(shù)據(jù)完整性的概述二、數(shù)據(jù)完整性分類1、實體完整性(EntityIntegrity)

將數(shù)據(jù)表中的每一行看作一個實體,所有行具有非空且沒有重復的標識字段。實現(xiàn)手段:唯一索引、主鍵約束、唯一約束、列的Identity屬性限制3.1數(shù)據(jù)完整性的概述二、數(shù)據(jù)完整性分類

2、域完整性(DomainIntegrity)

域(或列)完整性是指定列指定一組有效的值并決定是否可為空值。實現(xiàn)手段:

1.數(shù)據(jù)類型或是NOTNULL;

2.檢查約束和規(guī)則;

3.外鍵約束、默認值等規(guī)則限制。3.1數(shù)據(jù)完整性的概述二、數(shù)據(jù)完整性分類3、參照完整性(ReferentialIntegrity)

參照完整性確保主鍵(在被引用表中)和外鍵(在引用表中)之間的關系得到保持。

例如修改父表中關鍵字值后,子表關鍵字值未做相應改變;刪除父表的某記錄后,子表的相應記錄未刪除,致使這些記錄稱為孤立記錄;對于子表插入的記錄,父表中沒有相應關鍵字值的記錄;3.2約束學號姓名專業(yè)性別出生時間990201王俊鵬計算機男1983/10/1990202王巍計算機女1987/9/5990203李海燕計算機女1985/4/3學號課程號成績學分990201101804990201102902990202201784990202202954990203101882主鍵外鍵被引用表引用表學生信息表學生課程表3.1數(shù)據(jù)完整性的概述二、數(shù)據(jù)完整性分類4、用戶定義的完整性(User-definedIntegrity)用戶自定義完整性指針對某一具體關系數(shù)據(jù)庫的約束條件,它反映某一具體應用所涉及的數(shù)據(jù)必須滿足的語義要求。

3.1數(shù)據(jù)完整性的概述二、實施數(shù)據(jù)完整性的方法1、用定義約束實現(xiàn)數(shù)據(jù)完整性通過針對表和字段定義聲明的約束,將數(shù)據(jù)完整性成為數(shù)據(jù)定義的一部分,使用約束實現(xiàn)數(shù)據(jù)完整性。2、用編寫程序?qū)崿F(xiàn)數(shù)據(jù)完整性可以使用存儲過程或觸發(fā)器實施程序化數(shù)據(jù)完整性。3、選取數(shù)據(jù)完整性的實施方法由于約束在SQLSERVER的可執(zhí)行部分有一段代碼路徑,執(zhí)行速度比其它方式快,所以應優(yōu)先選用約束。需要在多個表之間保持數(shù)據(jù)的一致性,可選擇使用約束中的主鍵和外鍵約束;需要特別復雜的完整性檢驗,則使用觸發(fā)器和存儲過程

3.2約束一、

主鍵約束(PrimaryKeyConstraint)1、主鍵約束:主鍵是能夠唯一標識表中某一行的屬性或?qū)傩越M。語法:[CONSTRAINT約束名]PRIMARYKEY[CLUSTERED|NONCLUSTERED]{(列[,...n])}應用PRIMARYKEY約束的注意事項

1、每張表只能有一個PRIMARYKEY約束2、輸入的值必須是惟一的3、不允許空值4、將在指定列上創(chuàng)建惟一索引PRIMARYKEY約束(續(xù))PRIMARYKEY約束示例在Customers表上創(chuàng)建PRIMARYKEY約束,指明表的主鍵值是CustomerID,并且創(chuàng)建非聚集索引以強制約束4.4.3PRIMARYKEY約束USENorthwindALTERTABLEdbo.Customers

ADDCONSTRAINTPK_CustomersPRIMARYKEYNONCLUSTERED(CustomerID)排序規(guī)則指定表示每個字符的位模式以及存儲和比較字符所使用的規(guī)則。

Collate是一個子句,可應用于數(shù)據(jù)庫定義或列定義以定義排序規(guī)則,或應用于字符串表達式以應用排序規(guī)則投影。語法:Collatecollation_name

排序規(guī)則排序規(guī)則名稱由兩部份構(gòu)成,前半部份是指本排序規(guī)則所支持的字符集。

如:

Chinese_PRC_CS_AI_WS

前半部份:指UNICODE字符集,Chinese_PRC_指針對大陸簡體字UNICODE的排序規(guī)則。

排序規(guī)則的后半部份即后綴含義:

_BIN二進制排序

_CI(CS)是否區(qū)分大小寫,CI不區(qū)分,CS區(qū)分

_AI(AS)是否區(qū)分重音,AI不區(qū)分,AS區(qū)分

區(qū)分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。

區(qū)分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,比較還將重音不同的字母視為不等。3.2約束二、外鍵約束(ForeignKeyConstraint)1、外鍵約束:定義外鍵的目的是在于限制可以保存在外鍵所在表中的數(shù)據(jù)。外鍵由一個列或多個列的組合構(gòu)成,用來實現(xiàn)兩張表之間的數(shù)據(jù)聯(lián)系,維護兩個表間的一致性關系。語法:[CONSTRAINT約束名][FOREIGNKEY][(列[,…n])]

REFERENCES引用表

[(引用列

[,…n])]3.2約束學號姓名專業(yè)性別出生時間990201王俊鵬計算機男1983/10/1990202王巍計算機女1987/9/5990203李海燕計算機女1985/4/3學號課程號成績學分990201101804990201102902990202201784990202202954990203101882主鍵外鍵主表從表學生信息表學生課程表2、外鍵約束注意要點創(chuàng)建外鍵約束的前提是完成主表的主鍵定義;外鍵約束允許存在NULL值;外鍵約束不能用于臨時表和不同的數(shù)據(jù)庫之間。FOREIGNKEY約束(續(xù))FOREIGNKEY約束的示例使用FOREIGNKEY約束,確保Orders表中的客戶標識與Customers表中的有效的客戶標識相關聯(lián)USENorthwindALTERTABLEdbo.Orders

ADDCONSTRAINTFK_Orders_CustomersFOREIGNKEY(CustomerID)REFERENCESdbo.Customers(CustomerID)3.2約束三、惟一約束(UniqueConstraint)1、惟一約束:

在表指定的列或組列上不允許兩行是具有重復值時,則需要該列或組列上指定UNIQUE完整性約束。在UNIQUE約束定義中的列或組列稱為唯一碼。2、主鍵與UNIQUE約束的區(qū)別主要為:

UNIQUE約束,主要用在非主鍵的一列或多列上要求數(shù)據(jù)惟一的情況。

UNIQUE約束,允許該列上存在NULL值,而主鍵不允許??稍诒碇性O置多個UNIQUE約束,而在只能設置一個主鍵約束。應用UNIQUE約束的注意事項應用UNIQUE約束的注意事項允許一個空值在一個表上允許多個UNIQUE約束可在一個或者多個列上定義是通過一個惟一索引強制約束的3.2約束3、創(chuàng)建惟一約束的方法:

(1)使用SSMS創(chuàng)建惟一約束“對象資源管理器”右擊表名稱,選擇快捷菜單中的“修改”,進入表結(jié)構(gòu)修改狀態(tài)。單擊工具欄處“管理索引和鍵”按鈕(2)使用Transact-SQL語言創(chuàng)建惟一約束方法一:在創(chuàng)建表結(jié)構(gòu)的同時創(chuàng)建惟一約束,語法格式為:

CREATETABLE表名稱(字段定義,CONSTRAINT約束名UNIQUE(列名))方法二:在已經(jīng)建立結(jié)構(gòu)的表定義中添加惟一約束,語法格式:ALTERTABLE表名稱ADDCONSTRAINT約束名UNIQUE(字段名)3.2約束四、檢查約束(CheckConstraint)1、檢查約束:

限制輸入到一列或多列中的可能值,它通過檢查輸入表列的數(shù)據(jù)的值來維護值域的完整性。注意:1、一個表可以定義多個檢查約束,但每個建庫命令只能為每列定義一個檢查約束;2、在每次插入記錄或是修改記錄時,檢查約束會做相應檢查;3、自動編號字段不能應用檢查約束。應用CHECK約束的注意事項在每次執(zhí)行INSERT或者UPDATE語句的時候校驗數(shù)據(jù)值可以引用同表中的其他列不能包含子查詢列級CHECK約束可省略名字,讓系統(tǒng)自動生成表達式可以用AND以及OR連接以表示復雜邏輯表級CHECK約束可引用同行中的多列,但不能跨行或跨表可用CHECK約束來防止輸入NULL值,例如CHECK(輸入值

ISNOTNULL)3.2約束(2)使用Transact-SQL語言創(chuàng)建方法一:建立表結(jié)構(gòu)同時創(chuàng)建檢查約束,語法格式:CREETETABLE表名稱(字段定義,CONSTRAINT約束名CHECK

邏輯表達式)

方法二:表建立后增加檢查約束,語法格式如下:ALTERTABLE表名稱ADDCONSTRAINT約束名CHECK

邏輯表達式3.2約束【例3.11】在CJGL數(shù)據(jù)庫中為XS表字段XB(性別)設置檢查約束,要求XB字段值只能為“男”和“女”。

ALTERTABLEXSADDCONSTRAINTCK_XBCHECK性別IN(‘男’,’女’)禁用約束當在表上添加約束的時候,我們可以禁用對已有數(shù)據(jù)的約束檢查

語法:ALTERTABLE表名[WITHCHECKWITHNOCHECK]ADDCONSTRAINT約束名[FOREIGNKEY][(column[,…n])]REFERENCES引用表

[(引用列[,…n])][CHECK(搜索條件)]

禁用現(xiàn)有數(shù)據(jù)上的約束檢查(續(xù))對已有數(shù)據(jù)禁用約束檢查的注意事項只能禁用CHECK和FOREIGNKEY約束當為一個已有數(shù)據(jù)的表添加CHECK或FOREIGNKEY約束的時候,使用WITHNOCHECK選項來禁用對已有數(shù)據(jù)的約束檢查當現(xiàn)有數(shù)據(jù)不再變化的時候,使用WITHNOCHECK選項。若數(shù)據(jù)被更新,則它的新值必須符合CHECK約束確定禁用約束檢查是恰當?shù)摹T跊Q定添加約束前,可修改現(xiàn)有數(shù)據(jù)在加載新數(shù)據(jù)時禁用約束檢查為了避免約束檢查的開銷,有時候可能希望禁用約束已經(jīng)確保數(shù)據(jù)符合約束數(shù)據(jù)并不符合約束,但稍后可以更改其值并重用約束語法:ALTERTABLE表名{CHECK|NOCHECK}CONSTRAINT{ALL|約束名[,...n]}查看約束是啟用還是禁用的狀態(tài)系統(tǒng)存儲過程sp_help系統(tǒng)函數(shù)OBJECTPROPERTY的CnstIsDisabled

屬性3.2約束五、默認值約束(DefaultConstraint)1、默認值約束:可用于給列賦予一個常量值,用戶在插入新的數(shù)據(jù)行時,系統(tǒng)將默認該列以常量值為指定數(shù)據(jù)。注意:默認值可以是常量、函數(shù)、空值(NULL)等。2、創(chuàng)建默認值約束的方法(1)使用SSMS創(chuàng)建默認值約束(2)使用Transact-SQL語言DEFAULT約束如果一個列的值在INSERT語句中沒有指定,DEFAULT約束將自動輸入一個值,可以是預先指定的常量、NULL或者一個系統(tǒng)函數(shù)運行時的值

語法:[CONSTRAINT約束名]DEFAULT約束表達式

創(chuàng)建DEFAULT約束的兩種方法創(chuàng)建一個默認(CREATEDEFAULT),然后使用存儲過程sp_bindefault

將默認綁定到一個列CREATETABLE或ALTERTABLE時使用DEFAUTL約束應用DEFAULT約束的注意事項DEFAULT約束創(chuàng)建時將檢查表中的現(xiàn)存數(shù)據(jù)DEFAULT約束只對INSERT語句有效每列只能定義一個DEFAULT約束DEFAULT約束使用注意事項有可能會和CHECK約束沖突為具有PRIMARYKEY或UNIQUE約束的列指定默認值是沒有意義的常量值外面可以加或者不加括號,字符或者日期常量必須加上單引號或雙引號3.2約束六、約束管理1、查看約束SP_HELPCONSTRAINT表名稱2、刪除約束ALTERTABLE表名稱

DROPCONSTRAINT約束名決定使用何種約束完整性類型約束類型描述域DEFAULT如果在INSERT語句中未顯式提供

值,則指定為列提供的值CHECK指定列中可接受的數(shù)據(jù)值實體PRIMARYKEY惟一標識每一列,確保用戶沒有輸入重復的值。同時創(chuàng)建一個索引以增強性能。不允許空值UNIQUE確保在非主鍵列中不輸入重復值,并創(chuàng)建一個索引以增強性能。允許空值引用FOREIGNKEY定義一列或多列的值與同表或其他表中主鍵的值匹配CHECK基于同表中其他列的值,指定列中可接受的數(shù)據(jù)值使用約束的注意事項可直接在表上創(chuàng)建、更改和刪除約束,而不必刪除并重建表SQLServer里的約束只是“最后防線”當給一個表添加約束的時候,SQLServer將檢查現(xiàn)有數(shù)據(jù)是否違反約束建議創(chuàng)建約束的時候指定名稱,否則系統(tǒng)將為約束自動產(chǎn)生一個復雜的名稱名稱必須惟一,且符合SQLServer標識符的規(guī)則查看約束的信息系統(tǒng)存儲過程:sp_helpconstraint、sp_help創(chuàng)建約束使用CREATETABLE或者ALTERTABLECREATETABLE是在創(chuàng)建表時創(chuàng)建約束ALTERTABLE是在一個已有的表上創(chuàng)建約束可以添加約束到已有數(shù)據(jù)的表上可添加單列或多列約束若約束應用于單列,稱為列級約束若約束引用了多列,稱為表級約束,即使它并沒有引用表中的所有列3.3索引一、索引的作用與類型1、索引的作用索引是一個再表或視圖上創(chuàng)建的對象,當用戶查詢索引字段時,它可以快速實施數(shù)據(jù)檢索操作。借助索引,執(zhí)行查詢時不必掃描整個表就能夠快速找到所需要的數(shù)據(jù)。注意:(1)可以在那些經(jīng)常被用來查詢的列上建立索引,以提高查找效率?!纠印吭赟tudent表中可以分別建立基于學號、姓名的索引(2)索引將占用磁盤空間,并且降低添加、刪除和更新行的速度,所以要慎用!貨號貨名規(guī)格3002CPU處理器SY88001002計算機LX1003計算機FZ1001計算機LC2002顯示器172001顯示器153001CPU處理器P44001內(nèi)存儲器2564002內(nèi)存儲器512索引編號指針地址100141002210033200162002530017300214001840029表與索引示例索引的類型2、索引的類型(1)簇索引(CLUSTEREDINDEX)簇索引又稱聚集索引。簇索引在數(shù)據(jù)表中按照索引列的排序規(guī)則排列數(shù)據(jù)的物理順序。(2)非簇索引(NONCLUSTEREDINDEX)非簇索引是具有與表的數(shù)據(jù)完全分離的結(jié)構(gòu),它不會改變行的物理存儲順序,但是它是由數(shù)據(jù)行指針和一個索引值構(gòu)成的。(3)唯一索引(UNIQUEINDEX)唯—索引可以確保所有數(shù)據(jù)行中任意兩行的被索引列不包括NULL在內(nèi)的重復值。每個表只能有一個簇索引,因為一個表中的記錄只能以一種物理順序存放。但是,一個表可以有不止一個非簇索引。

從建立了簇索引的表中取出數(shù)據(jù)要比建立了非聚簇索引的表快。非簇索引需要大量的硬盤空間和內(nèi)存。

非簇索引可以提高從表中取數(shù)據(jù)的速度,它也會降低向表中插入和更新數(shù)據(jù)的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論