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

下載本文檔

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

文檔簡介

數(shù)據(jù)完整性控制第1頁,共87頁,2023年,2月20日,星期六本章學(xué)習(xí)目標通過本章的學(xué)習(xí),達到以下目標:理解數(shù)據(jù)完整性的概念、類型及實現(xiàn)方式。掌握使用約束來實現(xiàn)數(shù)據(jù)完整性。掌握使用IDENTITY列實現(xiàn)數(shù)據(jù)完整性。掌握使用默認值對象和規(guī)則實現(xiàn)數(shù)據(jù)完整性。第2頁,共87頁,2023年,2月20日,星期六本章目錄數(shù)據(jù)完整性概述6.1使用約束實現(xiàn)數(shù)據(jù)完整性6.2使用IDENTITY列6.3默認值和規(guī)則6.4實訓(xùn)66.5第3頁,共87頁,2023年,2月20日,星期六6.1數(shù)據(jù)完整性概述第4頁,共87頁,2023年,2月20日,星期六6.1.1數(shù)據(jù)完整性定義數(shù)據(jù)完整性是指數(shù)據(jù)的精確性和可靠性,主要用于保證數(shù)據(jù)庫中數(shù)據(jù)的質(zhì)量。它是為防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯誤信息的輸入/輸出造成無效操作或報錯而提出的。第5頁,共87頁,2023年,2月20日,星期六6.1.2數(shù)據(jù)完整性類型實體完整性實體完整性,又稱行完整性,用于保證表中的每一行數(shù)據(jù)在表中是唯一的。保證實體完整性的措施:PRIMARYKEY約束、UNIQUE約束或IDENTITY列。域完整性域完整性,又稱列完整性,是指數(shù)據(jù)表特定列輸入的有效性。用來保證列值的有效性與正確性。保證域完整性的措施:限制數(shù)據(jù)的類型或格式、CHECK約束、DEFAULT約束、NOTNULL約束或規(guī)則。參照完整性參照完整性,又稱引用完整性,是建立在外鍵與主鍵或外鍵與唯一鍵之間的一種引用規(guī)則。保證參照完整性的措施有FOREIGNKEY約束。用戶定義完整性用戶定義的不屬于其他任何完整性類別的特定業(yè)務(wù)規(guī)則,稱為用戶定義完整性。所有完整性類別都支持用戶定義完整性。第6頁,共87頁,2023年,2月20日,星期六6.1.3實現(xiàn)數(shù)據(jù)完整性的方式SQLServer2008中采用兩種方式實現(xiàn)數(shù)據(jù)完整性。1.聲明數(shù)據(jù)完整性聲明數(shù)據(jù)完整性是通過在數(shù)據(jù)庫中定義一系列的數(shù)據(jù)約束與驗證標準,并由數(shù)據(jù)庫系統(tǒng)自身在插入、修改、刪除數(shù)據(jù)時自動實施這些標準的一種數(shù)據(jù)完整性實現(xiàn)手段。聲明數(shù)據(jù)完整性主要通過定義與使用約束、默認值與規(guī)則來實現(xiàn)。2.過程數(shù)據(jù)完整性過程數(shù)據(jù)完整性是通過在腳本語言中定義一系列的數(shù)據(jù)約束與驗證標準,并在腳本執(zhí)行過程中強制完成這些標準的檢驗。過程數(shù)據(jù)完整性主要通過定義與使用視圖、觸發(fā)器和存儲過程來實現(xiàn)。本章僅介紹聲明數(shù)據(jù)完整性的實現(xiàn)方法與技術(shù)。第7頁,共87頁,2023年,2月20日,星期六6.2使用約束實現(xiàn)數(shù)據(jù)完整性第8頁,共87頁,2023年,2月20日,星期六6.2.1約束概述1.約束定義約束(constraint)是SQLServer2008提供的自動保持數(shù)據(jù)庫完整性的一種方法。約束就是限制,定義約束就是定義可輸入表或表的單個列中的數(shù)據(jù)的限制條件。2.約束分類在SQLServer中有6種約束:主鍵約束(primarykeyconstraint)唯一約束(uniqueconstraint)外鍵約束(foreignkeyconstraint)檢查約束(checkconstraint)默認約束(defaultconstraint)非空約束(notnullconstraint)第9頁,共87頁,2023年,2月20日,星期六約束與完整性之間的關(guān)系完整性類型約束類型描

述約束對象實體完整性primarykey每行記錄的唯一標識符,確保用戶不能輸入重復(fù)值,并自動創(chuàng)建索引,提高性能,該列不允許使用空值行unique在列集內(nèi)強制執(zhí)行值的唯一性,防止出現(xiàn)重復(fù)值,表中不允許有兩行的同一列包含相同的非空值,該列允許使用空值域完整性check指定某一列可接受的值列default當(dāng)使用INSERT語句插入數(shù)據(jù)時,若已定義默認值的列沒有提供指定值,則將默認值插入記錄中NOTNULL指定某一列的值不能為空參照完整性foreignkey定義一列或幾列,其值與其他表的主鍵或unique列相匹配表與表之間第10頁,共87頁,2023年,2月20日,星期六3.約束名在創(chuàng)建約束時,需要創(chuàng)建約束的名稱,約束名稱必須符合標識符命名規(guī)則。建議使用約束類型和其完成任務(wù)的從句組合作為約束名。例如,學(xué)生信息表的主鍵使用PK_學(xué)生信息表。4.創(chuàng)建約束的語法格式(1)使用CREATETABLE語句創(chuàng)建約束其語法格式如下:CREATETABLE表名(<列定義>[{,<列定義>|<表約束>}])其中,參數(shù)說明如下。表名:是合法標識符,最多可有128個字符。<列定義>:<列名><數(shù)據(jù)類型>[{<列約束>}]第11頁,共87頁,2023年,2月20日,星期六(2)使用ALTERTABLE語句創(chuàng)建約束其語法格式如下:ALTERTABLE表名ADD{<表約束>}在SQLServer中對基本表的約束分為:列約束:是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名。表約束:與列定義相互獨立,不包括在列定義中,通常用于對多個列一起進行約束,與列定義用“,”分隔,定義表約束時必須指出要約束的那些列的名稱。第12頁,共87頁,2023年,2月20日,星期六6.2.2主鍵約束主鍵約束(primarykeyconstraint)用于指定表的一列或幾列的組合來唯一標識表,即能在表中唯一地指定一行記錄,這樣的一列或列的組合稱為表的主鍵(primarykey,PK)。定義主鍵約束的列其值不可為空、不可重復(fù)。每個表中只能有一個主鍵。1.使用SSMS創(chuàng)建主鍵約束【例6.1】在學(xué)生成績數(shù)據(jù)庫中,創(chuàng)建第1章中設(shè)計的系部表,表的結(jié)構(gòu)如表1-10所示。分析:在例5.2中已經(jīng)創(chuàng)建系部表,但是沒有設(shè)置主鍵約束,且已經(jīng)在例5.12中刪除,在此利用SSMS重新創(chuàng)建具有主鍵約束的系部表。第13頁,共87頁,2023年,2月20日,星期六具體操作步驟如下:1)啟動SSMS。2)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】節(jié)點。右擊【表】節(jié)點,在彈出的快捷菜單窗口中執(zhí)行【新建表】命令,打開表設(shè)計器。3)在表設(shè)計器中,在【列名】單元格輸入字段名“系部編號”,在同一行的【數(shù)據(jù)類型】單元格設(shè)置該字段的數(shù)據(jù)類型為char(2),并在【允許Null值】列選擇不允許該字段為空值。4)重復(fù)步驟(3)設(shè)置“系部名稱”、“系部主任”列。5)將光標定位在“系部編號”行。6)單擊SSMS工具欄上的

按鈕設(shè)置主鍵,“系部編號”行顯示一個鑰匙圖標,如圖6-3所示。7)執(zhí)行【文件】|【保存】命令或單擊工具欄上的保存按鈕,在打開的對話框中輸入表名稱“系部表”,單擊【確定】按鈕保存表。第14頁,共87頁,2023年,2月20日,星期六圖6-3系部表結(jié)構(gòu)第15頁,共87頁,2023年,2月20日,星期六2.在創(chuàng)建表的同時創(chuàng)建主鍵約束1)創(chuàng)建單個列的主鍵可采用列級約束,它的語法格式如下。CREATETABLE表名(列名<列屬性>[CONSTRAINT約束名]PRIMARYKEY[CLUSTERED|NONCLUSTERED][,…n])2)多個列組合的主鍵約束,采用表級約束,它的語法格式如下。CREATETABLE表名

([CONSTRAINT約束名]PRIMARYKEY[CLUSTERED|NONCLUSTERED](列名1[,…列名n])[,…n])其中,CLUSTERED為默認值,表示創(chuàng)建聚集索引,NONCLUSTERED表示創(chuàng)建非聚集索引。第16頁,共87頁,2023年,2月20日,星期六【例6.2】在學(xué)生成績數(shù)據(jù)庫中,創(chuàng)建如表1-11所示的課程信息表。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句:USE學(xué)生成績GOCREATETABLE課程信息表(課程編號char(4)NOTNULLPRIMARYKEY,課程名稱varchar(30)NOTNULL,學(xué)分decimal(3,1)NULL,學(xué)時intNULL,考核類型char(4)NULL)GO【說明】列約束包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定約束名,系統(tǒng)自動給定約束名。第17頁,共87頁,2023年,2月20日,星期六【例6.3】在學(xué)生成績數(shù)據(jù)庫中,創(chuàng)建如表1-12所示的成績表。分析:由于創(chuàng)建的是組合主鍵約束,所以只能采用表級約束。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。

USE學(xué)生成績GOCREATETABLE成績表(CONSTRAINTPK_成績表PRIMARYKEY(學(xué)號,課程編號),學(xué)號char(8)NOTNULL,課程編號char(4)NOTNULL,成績decimal(4,1)NULL)GO【說明】①創(chuàng)建多個列組合的約束(如組合主鍵)時,只能將其定義為表級約束。②定義時必須指出要約束的那些列的名稱,與列定義用“,”分隔。第18頁,共87頁,2023年,2月20日,星期六3.在一張現(xiàn)有表上添加主鍵約束(1)使用SSMS添加主鍵約束在【對象資源管理器】窗口中,右擊要添加主鍵約束的表,在彈出的快捷菜單中執(zhí)行【設(shè)計】命令,利用表設(shè)計器添加主鍵約束。(2)利用ALTERTABLE語句它的語法格式如下:ALTERTABLE表名ADDCONSTRAIN約束名PRIMARYKEY[CLUSTERED|NONCLUSTERED](列名1[,…列名n])第19頁,共87頁,2023年,2月20日,星期六【例6.4】為例5.1和例5.2中創(chuàng)建的“學(xué)生信息表”和“班級表”添加主鍵約束。分析:在例5.1和例5.2中創(chuàng)建的“學(xué)生信息表”和“班級表”不帶主鍵約束,在此添加約束,修改表定義,使用ALTERTABLE語句。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。

USE學(xué)生成績GOALTERTABLE學(xué)生信息表ADDCONSTRAINTPK_學(xué)生信息表PRIMARYKEY(學(xué)號)GOALTERTABLE班級表ADDCONSTRAINTPK_班級表PRIMARYKEY(班級編號)GO第20頁,共87頁,2023年,2月20日,星期六4.刪除主鍵約束(1)使用SSMS刪除在【對象資源管理器】中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】|【要刪除約束的表】|【鍵】節(jié)點,右擊【主鍵約束名】,在彈出的快捷菜單中執(zhí)行【刪除】命令即可。(2)使用Transact-SQL語句刪除約束的語法格式如下。ALTERTABLE表名DROPCONSTRAINT約束名1[,…約束名n]第21頁,共87頁,2023年,2月20日,星期六6.2.3唯一約束唯一約束(uniqueconstraint)用于指定非主鍵的一個列或多個列的組合值具有唯一性,以防止在列中輸入重復(fù)的值,也就是說如果一個數(shù)據(jù)表已經(jīng)設(shè)置了主鍵約束,但該表中還包含其他的非主鍵列,也必須具有唯一性,為避免該列中的值出現(xiàn)重復(fù)輸入的情況,必須使用唯一約束(一個數(shù)據(jù)表不能包含兩個或兩個以上的主鍵約束)。唯一約束與主鍵約束的區(qū)別如下:唯一約束指定的列可以為NULL,但主鍵約束所在的列則不允許為NULL。一個表中可以包含多個唯一約束,而主鍵約束則只能有一個。第22頁,共87頁,2023年,2月20日,星期六1.使用SSMS創(chuàng)建唯一約束【例6.5】為例6.1中創(chuàng)建的“系部表”的“系部名稱”列設(shè)置唯一約束。具體操作步驟如下。1)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】節(jié)點。右擊【dbo.系部表】節(jié)點,在彈出的快捷菜單中執(zhí)行【設(shè)計】命令,打開表設(shè)計器。2)在表設(shè)計器中,將光標定位在“系部名稱”行,右擊,在彈出的快捷菜單中執(zhí)行【索引/鍵】命令,打開【索引/鍵】對話框。3)單擊【索引/鍵】對話框左下方的【添加】按鈕,按鈕上方的索引/鍵列表框中增加一個名為“IX_系部表*”的項,星號表示該名稱未確定,用戶可對其進行修改。第23頁,共87頁,2023年,2月20日,星期六4)在【索引/鍵】對話框右側(cè)的屬性面板中,修改【標識】的【名稱】屬性項的值,將“IX_系部表”改為“UQ_系部表”。5)修改【常規(guī)】屬性組中的兩個屬性項:從【類型】屬性右側(cè)的下拉列表中選擇“唯一鍵”,如圖6-4所示;單擊【列】屬性項右側(cè)的

按鈕,打開如圖6-5所示的【索引列】對話框,為唯一約束指定字段名與唯一索引的排序順序。6)單擊【索引/鍵】對話框右下方的【關(guān)閉】按鈕。7)執(zhí)行【文件】|【保存】命令或單擊工具欄上的

按鈕。至此,唯一約束創(chuàng)建完成。第24頁,共87頁,2023年,2月20日,星期六圖6-4【索引/鍵】對話框圖6-5【索引列】對話框第25頁,共87頁,2023年,2月20日,星期六2.創(chuàng)建表的同時創(chuàng)建唯一約束定義唯一約束的語法格式如下。語法格式1:CREATETABLE表名(列名<列屬性>[CONSTRAINT約束名]UNIQUE[CLUSTERED|NONCLUSTERED][,…n])語法格式2:CREATETABLE表名([CONSTRAINT約束名]UNIQUE[CLUSTERED|NONCLUSTERED](列名1[,…列名n])[,…n])其中,NONCLUSTERED為默認值。第26頁,共87頁,2023年,2月20日,星期六【例6.6】刪除系部表,重新創(chuàng)建如表1-10所示帶有主鍵約束和唯一約束完整的系部表。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。USE學(xué)生成績GODROPTABLE系部表GOCREATETABLE系部表(系部編號char(2)NOTNULLPRIMARYKEY,系部名稱varchar(16)NOTNULLUNIQUE,系部主任varchar(8)NULL)GO第27頁,共87頁,2023年,2月20日,星期六3.修改表語句創(chuàng)建唯一約束語法格式如下。ALTERTABLE表名ADDCONSTRAINT約束名UNIQUE[CLUSTERED|NONCLUSTERED](列名1[,…列名n])【例6.7】為例5.2中創(chuàng)建的“班級表”的“班級名稱”列添加唯一約束。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。USE學(xué)生成績GOALTERTABLE班級表ADDCONSTRAINTUQ_班級表UNIQUE(班級名稱)GO

唯一約束的刪除同主鍵約束,這里不再介紹。第28頁,共87頁,2023年,2月20日,星期六6.2.4外鍵約束外鍵約束(foreignkeyconstraint)強制實現(xiàn)參照完整性,能夠在同一個數(shù)據(jù)庫的多個表之間建立關(guān)聯(lián),并維護表與表之間的依賴關(guān)系。外鍵約束定義一個列或多個列的組合為當(dāng)前表的外鍵,該外鍵值引用其他表中的主鍵約束所映射列的列值。1.使用SSMS創(chuàng)建外鍵約束【例6.8】在學(xué)生成績數(shù)據(jù)庫中,為班級表添加外鍵。具體操作步驟如下。1)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】|【dbo.班級表】節(jié)點。右擊【鍵】節(jié)點,在彈出的快捷菜單中執(zhí)行【新建外鍵】命令,打開如圖6-6所示的【外鍵關(guān)系】對話框。2)單擊【表和列規(guī)范】屬性項右側(cè)的

按鈕,打開【表和列】對話框。選擇系部表作為主鍵表,其主鍵為“系部編號”,系統(tǒng)默認選擇班級表作為外鍵表,并將“系部編號”作為外鍵,如圖6-7所示,單擊【確定】按鈕。第29頁,共87頁,2023年,2月20日,星期六圖6-6【外鍵關(guān)系】對話框圖6-7【表和列】對話框第30頁,共87頁,2023年,2月20日,星期六3)在【外鍵關(guān)系】對話框中單擊【關(guān)閉】按鈕。然后保存對班級表結(jié)構(gòu)所做的修改,班級表的外鍵創(chuàng)建成功。刷新學(xué)生成績數(shù)據(jù)庫后,在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】|【dbo.班級表】|【鍵】節(jié)點,可以看到所創(chuàng)建的外鍵約束,如圖6-8所示。【說明】為確保班級表的外鍵約束創(chuàng)建成功,先把班級表中的記錄清除,因為在第5章中在班級表中插入有記錄,而系部表為空,這樣如不清除班級表中的記錄,創(chuàng)建外鍵約束時會發(fā)生沖突。圖6-8查看班級表外鍵第31頁,共87頁,2023年,2月20日,星期六2.使用ALTERTABLE語句定義外鍵約束語法格式如下:ALTERTABLE外鍵表名ADDCONSTRAINT外鍵約束名

FOREIGNKEY(列名1,列名2,…,列名n)REFERENCES主鍵表名

(列名1,列名2,…,列名n)[ONDELETE{CASCADE|NOACTION|SETNULL|SETDEFAULT}][ONUPDATE{CASCADE|NOACTION|SETNULL|SETDEFAULT}]第32頁,共87頁,2023年,2月20日,星期六其中,參數(shù)說明如下。ONDELETE選項子句用來規(guī)定當(dāng)從主鍵表中刪除記錄時,外鍵表中的記錄將執(zhí)行何種操作。子句各備選項參數(shù)意義如下。CASCADE:當(dāng)從主鍵表中刪除一行記錄時,外鍵表中的相應(yīng)記錄行將被刪除。NOACTION:當(dāng)從主鍵表中刪除一行記錄時,外鍵表不采取任何操作,僅返回刪除失敗的錯誤信息,為默認值。SETNULL:當(dāng)從主鍵表中刪除一行記錄時,外鍵表中相應(yīng)記錄各列被賦予空值。SETDEFAULT:當(dāng)從主鍵表中刪除一行記錄時,外鍵表中相應(yīng)記錄各列被賦予默認值。ONUPDATE選項子句用來規(guī)定當(dāng)從主鍵表中更新記錄時,外鍵表中的記錄將執(zhí)行何種操作。各參數(shù)的意義與ONDELETE子句相似。第33頁,共87頁,2023年,2月20日,星期六【例6.9】在學(xué)生成績數(shù)據(jù)庫中,為成績表創(chuàng)建外鍵約束。分析:在表1-12成績表的結(jié)構(gòu)中,有引用來自“學(xué)生信息表”的“學(xué)號”和“課程信息表”的“課程編號”兩個外鍵列,可以使用ALTERTABLE語句創(chuàng)建外鍵約束。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。USE學(xué)生成績GOALTERTABLE成績表ADDCONSTRAINTFK_成績表_學(xué)生信息表FOREIGNKEY(學(xué)號)REFERENCES學(xué)生信息表(學(xué)號)GOALTERTABLE成績表ADDCONSTRAINTFK_成績表_課程信息表FOREIGNKEY(課程編號)REFERENCES課程信息表(課程編號)GO第34頁,共87頁,2023年,2月20日,星期六3.使用數(shù)據(jù)庫關(guān)系圖創(chuàng)建外鍵約束【例6.10】在學(xué)生成績數(shù)據(jù)庫中,使用數(shù)據(jù)庫關(guān)系圖為學(xué)生信息表創(chuàng)建外鍵約束。分析:在表1-8學(xué)生信息表的結(jié)構(gòu)中,有引用來自“班級表”的“班級編號”外鍵列,這里使用數(shù)據(jù)庫關(guān)系圖為其創(chuàng)建外鍵約束。具體操作步驟如下。1)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】節(jié)點,右擊【數(shù)據(jù)庫關(guān)系圖】節(jié)點,在彈出的快捷菜單中執(zhí)行【新建數(shù)據(jù)庫關(guān)系圖】命令,打開如圖6-9所示的【添加表】對話框。2)在【添加表】對話框中,單擊【添加】按鈕把學(xué)生成績數(shù)據(jù)庫中的五張表都添加到數(shù)據(jù)庫關(guān)系圖中,單擊【關(guān)閉】按鈕。產(chǎn)生如圖6-10所示的學(xué)生成績數(shù)據(jù)庫關(guān)系圖。第35頁,共87頁,2023年,2月20日,星期六圖6-9【添加表】對話框圖6-10學(xué)生成績數(shù)據(jù)庫關(guān)系圖第36頁,共87頁,2023年,2月20日,星期六3)在圖6-10中可以看到學(xué)生成績數(shù)據(jù)庫中已經(jīng)建立的外鍵約束。在學(xué)生信息表中選中“班級編號”列,拖動鼠標指針指向班級表中的“班級編號”列,同時彈出【外鍵關(guān)系】和【表和列】兩個對話框,分別單擊【確定】和【關(guān)閉】按鈕即可給學(xué)生信息表創(chuàng)建外鍵約束。4)單擊工具欄上的

按鈕,保存數(shù)據(jù)庫關(guān)系圖,刷新數(shù)據(jù)庫即可查看學(xué)生信息表的外鍵約束。外鍵約束的刪除操作與主鍵約束相同,這里不再介紹。第37頁,共87頁,2023年,2月20日,星期六6.2.5檢查約束檢查約束(checkconstraint)通過控制列值的范圍來實現(xiàn)域完整性。檢查約束限制對特定列輸入數(shù)據(jù)的范圍或格式,確保該列獲得有效值,避免非法數(shù)據(jù)的產(chǎn)生與擴散。對同一個列可定義多個檢查約束。但標識列、ROWGUIDCOL列或數(shù)據(jù)類型為TIMESTAMP的列不能定義檢查約束,因為這幾類列的列值由數(shù)據(jù)庫系統(tǒng)自動添加。檢查約束的作用類似于外鍵約束,它們都能限制列的取值范圍。但兩種約束確定列值是否有效的方法卻不相同。檢查約束通過指定的邏輯表達式來限制列的取值范圍。外鍵約束則通過其他表來限制列的取值范圍。第38頁,共87頁,2023年,2月20日,星期六1.使用SSMS創(chuàng)建檢查約束【例6.11】在學(xué)生成績數(shù)據(jù)庫中,為學(xué)生信息表中的“性別”列添加檢查約束,要求其取值為“男”或“女”。分析:由于學(xué)生信息表已經(jīng)建立,這里用SSMS修改學(xué)生信息表結(jié)構(gòu),為“性別”列添加檢查約束。具體操作步驟如下。1)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】|【dbo.學(xué)生信息表】節(jié)點。右擊【約束】節(jié)點,在彈出的快捷菜單中執(zhí)行【新建約束】命令,打開【CHECK約束】對話框。2)修改【標識】的【名稱】屬性項的值為“CK_學(xué)生信息表_性別”;在【常規(guī)】的【表達式】屬性項中輸入“性別='男'OR性別='女'”,如圖6-11所示。3)單擊【關(guān)閉】按鈕。然后保存對學(xué)生信息表結(jié)構(gòu)所做的修改,“性別”列上成功創(chuàng)建檢查約束。第39頁,共87頁,2023年,2月20日,星期六圖6-11【CHECK約束】對話框第40頁,共87頁,2023年,2月20日,星期六2.使用CREATETABLE語句定義檢查約束使用CREATETABLE語句在建表時創(chuàng)建檢查約束,其語法格式如下。CREATETABLE表名(列名數(shù)據(jù)類型[<其他約束>][CONSTRAINT檢查約束名]CHECK(<約束表達式>)[,…n])【例6.12】在學(xué)生成績數(shù)據(jù)庫中,創(chuàng)建一個表名為“學(xué)生成績表”的新表,其表的結(jié)構(gòu)同表1-12成績表。分析:表1-12成績表已經(jīng)存在,此處為了演示用CREATETABLE語句在建表時創(chuàng)建檢查約束,所以新建一個“學(xué)生成績表”,此表在學(xué)生成績數(shù)據(jù)庫中沒有意義,本例用完后刪除。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。第41頁,共87頁,2023年,2月20日,星期六CREATETABLE學(xué)生成績表(學(xué)號char(8)NOTNULL,課程編號char(4)NOTNULL,成績decimal(4,1)NULLCHECK(成績>=0AND成績<=100),CONSTRAINTPK_學(xué)生成績表PRIMARYKEY(學(xué)號,課程編號),CONSTRAINTFK_學(xué)生成績表_學(xué)生信息表FOREIGNKEY(學(xué)號)REFERENCES學(xué)生信息表(學(xué)號),CONSTRAINTFK_學(xué)生成績表_課程信息表FOREIGNKEY(課程編號)REFERENCES課程信息表(課程編號))GO第42頁,共87頁,2023年,2月20日,星期六【說明】本例在建表時,同時創(chuàng)建了主鍵約束(復(fù)合主鍵)、外鍵約束和檢查約束,很具有代表性。前面沒有講用CREATETABLE語句建外鍵約束,不是不可以,只是更常用ALTERTABLE語句。此處所建“學(xué)生成績表”用完后,要刪除,后面不再使用。3.使用ALTERTABLE語句定義檢查約束其語法格式如下。ALTERTABLE表名[WITH{CHECK|NOCHECK}]ADDCONSTRAINT檢查約束名CHECK(<約束表達式>)其中,參數(shù)說明如下。WITHCHECK:對表中已有記錄進行約束檢查,此值為默認值。WITHNOCHECK:對表中已有記錄不進行約束檢查,只對以后插入的新記錄進行檢查。第43頁,共87頁,2023年,2月20日,星期六【例6.13】在學(xué)生成績數(shù)據(jù)庫中,為課程信息表的“考核類型”列和成績表的“成績”列分別添加檢查約束。分析:從表1-11課程信息表結(jié)構(gòu)可知,“考核類型”列取值為“考試”或“考查”;從表1-12成績表結(jié)構(gòu)可知,“成績”列取值在0~100。由于課程信息表和成績表已經(jīng)存在,這里用ALTERTABLE語句來實現(xiàn)檢查約束的創(chuàng)建。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。第44頁,共87頁,2023年,2月20日,星期六USE學(xué)生成績GOALTERTABLE課程信息表ADDCONSTRAINTCK_課程信息表_考核類型CHECK(考核類型='考試'OR考核類型='考查')GOALTERTABLE成績表ADDCONSTRAINTCK_成績表_成績CHECK(成績>=0AND成績<=100)GO第45頁,共87頁,2023年,2月20日,星期六4.刪除檢查約束(1)使用SSMS刪除在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】|【要刪除約束的表】|【約束】節(jié)點,右擊【檢查約束名】,在彈出的快捷菜單中執(zhí)行【刪除】命令即可。(2)使用Transact-SQL語句刪除檢查約束的語法格式與刪除主鍵約束相同。第46頁,共87頁,2023年,2月20日,星期六6.2.6默認值約束默認值約束(DefaultConstraint)用于確保域完整性,它提供了一種為數(shù)據(jù)表中的任何一列提供默認值的手段。默認值是指使用INSERT語句向數(shù)據(jù)表中插入數(shù)據(jù)時,如果沒有為某一列指定數(shù)據(jù),默認值約束提供隨新記錄一起存儲到數(shù)據(jù)表中該列的默認值。在使用默認值約束時,用戶需注意以下幾點。默認值約束只能應(yīng)用于INSERT語句,且定義的值必須與該列的數(shù)據(jù)類型和精度一致。在每一列上只能有一個默認值約束。默認值約束不能定義在指定IDENTITY屬性或數(shù)據(jù)類型為timestamp的列上。默認值約束允許使用一些系統(tǒng)函數(shù)提供的值。第47頁,共87頁,2023年,2月20日,星期六1.使用SSMS創(chuàng)建默認值約束【例6.14】在學(xué)生成績數(shù)據(jù)庫的學(xué)生信息表中,為“族別”列添加默認值“漢族”。具體操作步驟如下。1)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【表】節(jié)點。右擊【dbo.學(xué)生信息表】節(jié)點,在彈出的快捷菜單中執(zhí)行【設(shè)計】命令,打開表設(shè)計器。2)將光標定位到“族別”字段。在【列屬性】區(qū)域的【默認值或綁定】欄中輸入“‘漢族’”,如圖6-12所示。3)單擊工具欄上的保存按鈕,保存設(shè)置。第48頁,共87頁,2023年,2月20日,星期六圖6-12創(chuàng)建默認值約束第49頁,共87頁,2023年,2月20日,星期六2.使用CREATETABLE語句創(chuàng)建默認值約束語法格式如下。CREATETABLE表名(列名數(shù)據(jù)類型[<其他約束>][CONSTRAINT默認值約束名]DEFAULT<默認值表達式>[,...n])【例6.15】在學(xué)生成績數(shù)據(jù)庫中,新建一個Students表,其中包含學(xué)號、姓名和族別三個字段,族別有默認值“漢族”。分析:本例為了演示在建表的同時創(chuàng)建默認值約束,所建的Students表在學(xué)生成績數(shù)據(jù)庫中沒有用,用完要刪除。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。第50頁,共87頁,2023年,2月20日,星期六USE學(xué)生成績GOCREATETABLEStudents(學(xué)號Char(8)NOTNULLPRIMARYKEY,姓名Varchar(12)NOTNULL,族別Varchar(8)NOTNULLDEFAULT'漢族')GO第51頁,共87頁,2023年,2月20日,星期六3.使用ALTERTABLE語句添加默認值約束語法格式如下。ALTERTABLE表名ADDCONSTRAINT默認值約束名DEFAULT(<默認值表達式>)FOR列名【例6.16】在學(xué)生成績數(shù)據(jù)庫的學(xué)生信息表中,為“族別”列添加默認值“漢族”。分析:在例6.14已經(jīng)為學(xué)生信息表中的“族別”列添加默認值。先刪除再使用ALTERTABLE語句完成任務(wù)。第52頁,共87頁,2023年,2月20日,星期六在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。USE學(xué)生成績GOALTERTABLE學(xué)生信息表ADDCONSTRAINTDF_學(xué)生信息表_族別DEFAULT'漢族'FOR族別GO第53頁,共87頁,2023年,2月20日,星期六6.2.7非空約束非空約束(notnullconstraint)用來實現(xiàn)域完整性,指定特定列的值不允許為空,即讓該列拒絕接受空值。1.使用SSMS創(chuàng)建非空約束使用SSMS創(chuàng)建非空約束比較簡單,設(shè)計表時,在表設(shè)計器中,選中需要設(shè)置非空約束的列,在【允許Null值】列選擇不允許該字段為空值,即復(fù)選框不被選中。2.使用CREATETABLE語句創(chuàng)建非空約束語法格式如下。CREATETABLE表名(列名數(shù)據(jù)類型[<其他約束>][CONSTRAINT非空約束名]{NULL|NOTNULL}[,...n])第54頁,共87頁,2023年,2月20日,星期六3.ALTERTABLE語句添加非空約束語法格式如下。ALTERTABLE表名ALTERCOLUMN列名數(shù)據(jù)類型{NULL|NOTNULL}第55頁,共87頁,2023年,2月20日,星期六6.3使用IDENTITY列第56頁,共87頁,2023年,2月20日,星期六6.3.1建立IDENTITY列1.使用SSMS創(chuàng)建IDENTITY列【例6.17】在學(xué)生成績數(shù)據(jù)庫中,新建一名為“New_系部表”的表,其表結(jié)構(gòu)如表6-2所示。列

名數(shù)據(jù)類型寬

度為

性說

明系部編號Int00主關(guān)鍵字,自動編號系部名稱Varchar16取值唯一系部主任Varchar08√表6-2New_系部表第57頁,共87頁,2023年,2月20日,星期六具體操作步驟如下。1)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】節(jié)點。右擊【表】節(jié)點,在彈出的快捷菜單中執(zhí)行【新建表】命令,打開表設(shè)計器。2)按照前面介紹的方法輸入各列,設(shè)置相關(guān)屬性,建立主鍵和唯一約束。這里重點介紹如何設(shè)置“系部編號”的自動編號。3)把光標定位到系部編號列,在【列屬性】區(qū)域展開【標識規(guī)范】,設(shè)置【(是標識)】的屬性值為“是”,【標識增量】屬性值為1,【標識種子】屬性值為1,如圖6-13所示。4)單擊工具欄上的保存按鈕,在彈出的【選擇名稱】對話框中,輸入新表名“New_系部表”,單擊【確定】按鈕即可。第58頁,共87頁,2023年,2月20日,星期六圖6-13設(shè)置IDENTITY列第59頁,共87頁,2023年,2月20日,星期六2.使用CREATETABEL語句創(chuàng)建IDENTITY列語法格式如下。CREATETABLE表名(列名數(shù)據(jù)類型[<其他約束>]IDENTITY[(seed,increment)][,...n])其中,參數(shù)說明如下。數(shù)據(jù)類型:必須是整型數(shù)據(jù)類型或decimal和numeric。Seed:裝載到表中的第一行所使用的值,又稱標識種子,默認值為1。Increment:增量值,該值被添加到前一個已裝載的行的標識值上,默認值為1。第60頁,共87頁,2023年,2月20日,星期六【例6.18】在學(xué)生成績數(shù)據(jù)庫中,新建一名為“New_成績表”的表,其表結(jié)構(gòu)如表6-3所示。列

名數(shù)據(jù)類型寬

度為

性說

明序號(ID)Int0主關(guān)鍵字,自動編號學(xué)號Char8課程編號Char4成績Decimal(4,1)√取值在0~100表6-3New_成績表第61頁,共87頁,2023年,2月20日,星期六在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。USE學(xué)生成績GOCREATETABLENew_成績表([序號(ID)]IntNOTNULLPRIMARYKEYIDENTITY(1,1),學(xué)號Char(8)NOTNULL,課程編號Char(4)NOTNULL,成績Decimal(4,1)CHECK(成績>=0AND成績<=100)GO第62頁,共87頁,2023年,2月20日,星期六3.使用ALTERTABEL語句添加IDENTITY列語法格式如下。ALTERTABLE表名ADD列名數(shù)據(jù)類型IDENTITY[(seed,increment)]【例6.19】在學(xué)生成績數(shù)據(jù)庫的New_成績表中,先刪除例6.18中建的標識列“序號(ID)”,再新增一個名為“成績序號(ID)”的標識列,種子為1,增量為2。分析:在例6.18建標識列“序號(ID)”的同時定義了主鍵約束,要刪除該列,得先刪除該列上的主鍵,先在【對象資源管理器】中,查看一下該表主鍵的名稱,該名稱為系統(tǒng)自動生成。第63頁,共87頁,2023年,2月20日,星期六在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句:USE學(xué)生成績GOALTERTABLENew_成績表DROPCONSTRAINTPK__New_成績表__5B9C8F9E619B8048GOALTERTABLENew_成績表DROPCOLUMN[序號(ID)]GOALTERTABLENew_成績表ADD[成績序號(ID)]IntIDENTITY(1,2)GO第64頁,共87頁,2023年,2月20日,星期六6.3.2使用IDENTITY列【例6.20】在學(xué)生成績數(shù)據(jù)庫的New_系部表中,插入三條記錄,并查詢插入記錄后的New_系部表。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。USE學(xué)生成績GOINSERTINTONew_系部表(系部名稱,系部主任)VALUES('信息工程系','張嵐')INSERTINTONew_系部表(系部名稱,系部主任)VALUES('生物工程系','趙曉紅')INSERTINTONew_系部表(系部名稱,系部主任)VALUES('工程技術(shù)系','王江林')GOSELECT*FROMNew_系部表

GO

第65頁,共87頁,2023年,2月20日,星期六運行結(jié)果如圖6-14所示。圖6-14在New_系部表中使用IDENTITY列第66頁,共87頁,2023年,2月20日,星期六【說明】如果經(jīng)常進行刪除記錄操作的表中存在IDENTITY列,那么在標識值之間可能會產(chǎn)生差距。如果這構(gòu)成了問題,那么請不要使用IDENTITY屬性。但是,為了確保不產(chǎn)生差距,或為了彌補現(xiàn)有的差距,在用“SETIDENTITY_INSERT表名ON”設(shè)置顯式地輸入標識值之前,請先對現(xiàn)有的標識值進行計算。第67頁,共87頁,2023年,2月20日,星期六6.4默認值和規(guī)則第68頁,共87頁,2023年,2月20日,星期六6.4.1默認值與默認值約束類似,默認值(default)的作用也是當(dāng)用戶向數(shù)據(jù)表中插入數(shù)據(jù)行時,如果沒有為某列輸入值,則由SQLServer自動為該列賦予默認值。與默認值約束不同的是,默認值是一種數(shù)據(jù)庫對象。使用默認值對象的方法:使用CREATEDEFAULT語句創(chuàng)建默認值對象。使用系統(tǒng)存儲過程sp_bindefault將其綁定到列上。1.創(chuàng)建默認值對象創(chuàng)建默認值對象的語法格式如下。CREATEDEFAULTdefault_nameASconstant_expression其中,default_name為默認值對象名稱;constant_expression為只包含常量值的表達式。第69頁,共87頁,2023年,2月20日,星期六2.默認值綁定系統(tǒng)存儲過程sp_bindefault用于將默認值綁定到列或用戶定義的數(shù)據(jù)類型,它的語法格式如下。sp_bindefaultdefault_name,'object_name'[,'futureonly_flag']其中,各參數(shù)的含義如下。'object_name':為被綁定默認值的列名或用戶定義的數(shù)據(jù)類型。'futureonly_flag':僅當(dāng)將默認值綁定到用戶定義數(shù)據(jù)類型時才能使用。當(dāng)此參數(shù)設(shè)置為futureonly時,該數(shù)據(jù)類型的現(xiàn)有列無法繼承新默認值。如果futureonly_flag為NULL,則新默認值將綁定到用戶定義數(shù)據(jù)類型的所有列。默認值為NULL。第70頁,共87頁,2023年,2月20日,星期六【例6.21】在學(xué)生成績數(shù)據(jù)庫中,創(chuàng)建一個默認值對象“DF_族別”,值為“漢族”,并將其綁定到學(xué)生信息表的“族別”列。在查詢編輯器窗口中執(zhí)行如下Transact-SQL語句。

USE學(xué)生成績GO--創(chuàng)建默認值對象CREATEDEFAULTDF_族別AS'漢族'GO--綁定默認值對象EXECsp_bindefaultDF_族別,'學(xué)生信息表.族別'GO第71頁,共87頁,2023年,2月20日,星期六【說明】①默認值約束和默認值對象不能同時在某個列上使用,本例在學(xué)生信息表的“族別”列綁定默認值對象“DF_族別”時,必須先把例6.16中“族別”列上的默認值約束刪除。②默認值對象可以多次綁定到多個不同的列上,本例中默認值對象“DF_族別”僅使用了一次,不能很好地體現(xiàn)默認值對象較默認值約束的優(yōu)勢,這里只是簡單說明默認值的使用。第72頁,共87頁,2023年,2月20日,星期六【例6.22】使用SSMS工具查看默認值對象“DF_族別”和學(xué)生信息表的“族別”列的綁定情況。具體操作步驟如下。1)啟動SSMS。2)在【對象資源管理器】窗口中,展開【數(shù)據(jù)庫】|【學(xué)生成績】|【可編程性】|【默認值】節(jié)點,可以看到定義的默認值對象“DF_族別”。3)展開【表】|【學(xué)生信息表】|【列】節(jié)點,右擊【族別】列,在彈出的快捷菜單中執(zhí)行【屬性】命令,打開【列屬性】對話框如圖6-15所示,在【默認值綁定】單元格中顯示綁定到“DF_族別”默認值。第73頁,共87頁,2023年,2月20日,星期六圖6-15顯示綁定默認值對象第74頁,共87頁,2023年,2月20日,星期六3.默認值刪除刪除默認值對象的正確方法:首先解除所有的綁定,然后再刪除默認值對象。解除綁定到列或用戶定義的數(shù)據(jù)類型的默認值對象的語法格式如下。sp_unbindefault’object_name’[,'futureonly_flag']其中,'futureonly_flag'僅在解除用戶自定義數(shù)據(jù)類型的默認值綁定時使用。默認值為NULL。當(dāng)futureonly_flag的數(shù)據(jù)類型為futureonly時,該數(shù)據(jù)類型的現(xiàn)有列不會失去指定默認值。刪除默認值對象的語法格式如下。DROPDEFAULTdefault_name[,...n]第75頁,共87頁,2023年,2月20日,星期六【例6.23】刪除默認值對象“DF_族別”。執(zhí)行如下Transact-SQL語句。--解除綁定EXECsp_unbindefault'學(xué)生信息表.族別'GO--刪除默認值對象DROPDEFAULTDF_族別GO

運行結(jié)果如圖6-16所示。圖6-16刪除默認值對象第76頁,共87頁,2023年,2月20日,星期六6.4.2規(guī)則規(guī)則(rule)就是對存儲在表中列或用戶自定義數(shù)據(jù)類型的取值范圍的規(guī)定或限制。規(guī)則是一種數(shù)據(jù)庫對象。規(guī)則和約束可以同時使用,表中的列可以有一個規(guī)則及多個CHECK約束,規(guī)則與CHECK約束很相似。相比之下,使用在ALTERTABLE或CREATETABLE命令中的CHECK約束是更標準的限制列值的方法,但CHECK約束不能直接作用于用戶自定義數(shù)據(jù)類型。1.創(chuàng)建規(guī)則語法格式如下。CREATERULErule_nameAScondition_expression其中,rule_name為規(guī)則名稱。condition_expression是規(guī)則的定義,可以是用于WHERE條件子句中的任何表達式。第77頁,共87頁,2023年,2月20日,星期六2.規(guī)則的綁定使用系統(tǒng)存儲過程sp_bindrule將規(guī)則綁定到列或用戶定義的數(shù)據(jù)類型。它的語法格式如下。sp_bindrulerule_name,'object_name'[,'futureonly_flag']其中,各參數(shù)的含義如下?!畂bject_name’:要綁定規(guī)則的

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論