




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、2021-7-1211 第第9章章 數(shù)據(jù)完整性數(shù)據(jù)完整性 2021-7-1222 本章內(nèi)容本章內(nèi)容 n 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 n 9.2 約束約束 n 9.3 規(guī)則規(guī)則 n 9.4 默認值默認值 2021-7-1233 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 數(shù)據(jù)完整性是指數(shù)據(jù)庫中存儲數(shù)據(jù)的一致性和正確性,數(shù)據(jù)完整性是指數(shù)據(jù)庫中存儲數(shù)據(jù)的一致性和正確性, 確保各個文件或表中的數(shù)據(jù)值的關(guān)系一致,確保數(shù)據(jù)庫中的確保各個文件或表中的數(shù)據(jù)值的關(guān)系一致,確保數(shù)據(jù)庫中的 數(shù)據(jù)可以成功和正確地更新數(shù)據(jù)可以成功和正確地更新 。 數(shù)據(jù)庫設(shè)計的一項重要內(nèi)容是確定如何加強數(shù)據(jù)的完整數(shù)據(jù)庫設(shè)計的一項重要內(nèi)容是確定如何加
2、強數(shù)據(jù)的完整 性。性。 2021-7-1244 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 n 關(guān)系數(shù)據(jù)完整性關(guān)系數(shù)據(jù)完整性 關(guān)系數(shù)據(jù)完整性包括一下內(nèi)容:關(guān)系數(shù)據(jù)完整性包括一下內(nèi)容: (1) 實體完整性實體完整性 實體完整性就是把表中每一條記錄看作一個實體,要求實體完整性就是把表中每一條記錄看作一個實體,要求 所有行都具有唯一標識,即主鍵,且主鍵的值非空,又稱為所有行都具有唯一標識,即主鍵,且主鍵的值非空,又稱為 行完整性行完整性 。 (2) 域完整性域完整性 域完整性是關(guān)于數(shù)據(jù)列取值有效性的限制域完整性是關(guān)于數(shù)據(jù)列取值有效性的限制 。域完整性通。域完整性通 常用有效性檢查來實現(xiàn),也可以通過限制數(shù)據(jù)類型、格
3、式或常用有效性檢查來實現(xiàn),也可以通過限制數(shù)據(jù)類型、格式或 者可能的取值范圍來實現(xiàn)者可能的取值范圍來實現(xiàn) 。 例如,對于例如,對于teaching數(shù)據(jù)庫中數(shù)據(jù)庫中s_c表中,表中,GRADE字段的取字段的取 值只能是從值只能是從0到到100的整數(shù)值,而不能為其他數(shù)值的整數(shù)值,而不能為其他數(shù)值 。 2021-7-1255 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 (3) 參照完整性參照完整性 參照完整性是對外鍵取值有效性的限制,以確保數(shù)據(jù)在參照完整性是對外鍵取值有效性的限制,以確保數(shù)據(jù)在 另一個參照表的取值范圍內(nèi)另一個參照表的取值范圍內(nèi) 。參照完整性要求外鍵的取值只。參照完整性要求外鍵的取值只 能取參照表中的
4、有效值或空值能取參照表中的有效值或空值 。如果在參考表中某一記錄的。如果在參考表中某一記錄的 主鍵被依賴表中的外部鍵參考,那么這一記錄既不能刪除,主鍵被依賴表中的外部鍵參考,那么這一記錄既不能刪除, 也不能修改其主鍵值,以確保關(guān)鍵字的一致性也不能修改其主鍵值,以確保關(guān)鍵字的一致性 。 (4) 用戶定義完整性用戶定義完整性 用戶定義完整性允許特定的不屬于上述類別規(guī)則的完整用戶定義完整性允許特定的不屬于上述類別規(guī)則的完整 性定義,前面的性定義,前面的3個完整性類型都支持用戶定義完整性。個完整性類型都支持用戶定義完整性。 實現(xiàn)用戶定義完整性,可以有兩種方法,即聲明數(shù)據(jù)完實現(xiàn)用戶定義完整性,可以有兩種
5、方法,即聲明數(shù)據(jù)完 整性和過程數(shù)據(jù)完整性。整性和過程數(shù)據(jù)完整性。 2021-7-1266 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 聲明數(shù)據(jù)完整性聲明數(shù)據(jù)完整性 聲明數(shù)據(jù)完整性是通過在對象定義中定義的標準來實現(xiàn)聲明數(shù)據(jù)完整性是通過在對象定義中定義的標準來實現(xiàn) 數(shù)據(jù)完整性,是由系統(tǒng)本身的自動強制來實現(xiàn)的,它包括使數(shù)據(jù)完整性,是由系統(tǒng)本身的自動強制來實現(xiàn)的,它包括使 用各種約束、缺省的規(guī)則。用各種約束、缺省的規(guī)則。 過程數(shù)據(jù)完整性過程數(shù)據(jù)完整性 過程數(shù)據(jù)完整性是通過在腳本語言中定義的完整性標準過程數(shù)據(jù)完整性是通過在腳本語言中定義的完整性標準 來實現(xiàn)的,當執(zhí)行這些腳本時,就可以強制完整性的實現(xiàn)來實現(xiàn)的,當執(zhí)行這
6、些腳本時,就可以強制完整性的實現(xiàn) 。 過程數(shù)據(jù)完整性的方式包括使用觸發(fā)器和存儲過程等。過程數(shù)據(jù)完整性的方式包括使用觸發(fā)器和存儲過程等。 2021-7-1277 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 n SQL Server 2005中的數(shù)據(jù)完整性中的數(shù)據(jù)完整性 各類數(shù)據(jù)完整性和對應(yīng)實現(xiàn)完整性的各類數(shù)據(jù)完整性和對應(yīng)實現(xiàn)完整性的SQL Server組件如表組件如表9.1所示所示 。 數(shù)據(jù)完整性數(shù)據(jù)完整性 對應(yīng)的對應(yīng)的SQL Server組件組件 實體完整性實體完整性 PRIMARY KEY(主鍵主鍵)約束、約束、UNIQUE(唯一唯一) 約束約束UNIQUE INDEX(唯一索引唯一索引)、 IDENTI
7、TY COLUMN(標識列標識列) 域完整性域完整性 DEFAULT(默認值默認值)、CHECK(檢查檢查)約束、約束、 RULE(規(guī)則規(guī)則)FOREIGN KEY(外鍵外鍵)約束、約束、 DATA TYPE(數(shù)據(jù)類型數(shù)據(jù)類型) 參照完整性參照完整性 FOREIGN KEY (外鍵外鍵)約束、約束、CHECK (檢查檢查) 約束約束TRIGGER(觸發(fā)器觸發(fā)器)、STORED PROCEDURE(存儲過程存儲過程) 用戶定義完整性用戶定義完整性 RULE(規(guī)則規(guī)則)、TRIGGER(觸發(fā)器觸發(fā)器)、 STORED PROCEDURE(存儲過程存儲過程) 2021-7-1288 9.1 數(shù)據(jù)完整
8、性數(shù)據(jù)完整性 (1) 空值空值 數(shù)據(jù)表中的列可以接受空值,也可以拒絕空值。在數(shù)據(jù)數(shù)據(jù)表中的列可以接受空值,也可以拒絕空值。在數(shù)據(jù) 庫中,庫中,NULL是一個特殊值,表示未知值的概念。是一個特殊值,表示未知值的概念。 NULL不同于空字符或不同于空字符或0??兆址且粋€有效的字符,??兆址且粋€有效的字符,0是是 一個有效的數(shù)字。一個有效的數(shù)字。NULL只是表示此值未知這一概念。只是表示此值未知這一概念。 NULL也不同于零長度字符串也不同于零長度字符串(空串空串)。 如果列定義中包含如果列定義中包含NOT NULL子句,則不能為該列輸入子句,則不能為該列輸入 NULL值。如果列定義中僅包含值。
9、如果列定義中僅包含NULL關(guān)鍵字,則接受關(guān)鍵字,則接受 NULL值值 2021-7-1299 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 (2) 約束約束 約束定義關(guān)于列中允許值的規(guī)則,是強制實施完整性的約束定義關(guān)于列中允許值的規(guī)則,是強制實施完整性的 標準機制。使用約束優(yōu)先于使用標準機制。使用約束優(yōu)先于使用DML觸發(fā)器觸發(fā)器、規(guī)則規(guī)則和和默認默認 值值 。 約束類型約束類型 SQL Server 2005有下列約束類型有下列約束類型 : NOT NULL約束約束 :非空約束,指定列不接受:非空約束,指定列不接受NULL值值 . CHECK約束約束 :檢查約束,通過限制可輸入到列中的值:檢查約束,通過限制可
10、輸入到列中的值 來強制實施域完整性來強制實施域完整性 。 a. UNIQUE約束:唯一約束,強制實施列取值集合中值的約束:唯一約束,強制實施列取值集合中值的 唯一性。主鍵強制實施唯一性,但主鍵不允許唯一性。主鍵強制實施唯一性,但主鍵不允許NULL作為一作為一 個唯一值。個唯一值。 2021-7-121010 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 d. PRIMARY KEY約束:主鍵約束,標識具有唯一標識約束:主鍵約束,標識具有唯一標識 表中行的值的列或列集表中行的值的列或列集 。 e. FOREIGN KEY約束:外鍵約束,標識并強制實施表約束:外鍵約束,標識并強制實施表 之間的關(guān)系之間的關(guān)系 。
11、列約束和表約束列約束和表約束 列約束指定為列定義的一部分,并且只應(yīng)用于該列。表列約束指定為列定義的一部分,并且只應(yīng)用于該列。表 約束的聲明與列定義無關(guān),可以應(yīng)用于表中多個列約束的聲明與列定義無關(guān),可以應(yīng)用于表中多個列 。當一個。當一個 約束中必須包含多個列時,應(yīng)使用表約束。約束中必須包含多個列時,應(yīng)使用表約束。 2021-7-121111 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 (3) 規(guī)則規(guī)則 規(guī)則用于執(zhí)行一些與規(guī)則用于執(zhí)行一些與CHECK約束相同的功能。使用約束相同的功能。使用 CHECK約束是限制列值的首選標準方法。約束是限制列值的首選標準方法。CHECK約束還約束還 比規(guī)則更簡明。一個列只能應(yīng)用
12、一個規(guī)則,但可以應(yīng)用多個比規(guī)則更簡明。一個列只能應(yīng)用一個規(guī)則,但可以應(yīng)用多個 CHECK約束。約束。CHECK約束被指定為約束被指定為CREATE TABLE語句語句 的一部分,而規(guī)則是作為單獨的對象創(chuàng)建,然后綁定到列上。的一部分,而規(guī)則是作為單獨的對象創(chuàng)建,然后綁定到列上。 2021-7-121212 9.1 數(shù)據(jù)完整性數(shù)據(jù)完整性 (4) 默認值默認值 如果插入行時沒有為列指定值,默認值則指定列中默認如果插入行時沒有為列指定值,默認值則指定列中默認 取值。默認值可以是計算結(jié)果為常量的任何值,例如常量、取值。默認值可以是計算結(jié)果為常量的任何值,例如常量、 內(nèi)置函數(shù)或數(shù)學(xué)表達式。內(nèi)置函數(shù)或數(shù)學(xué)表
13、達式。 若要應(yīng)用默認值,可以通過在若要應(yīng)用默認值,可以通過在CREATE TABLE中使用中使用 DEFAULT關(guān)鍵字來創(chuàng)建默認值定義。這將為每一列分配一關(guān)鍵字來創(chuàng)建默認值定義。這將為每一列分配一 個常量表達式作為默認值,也可以作為單獨的對象創(chuàng)建,然個常量表達式作為默認值,也可以作為單獨的對象創(chuàng)建,然 后綁定到列上。后綁定到列上。 2021-7-121313 9.2 約束約束 約束是通過限制字段中數(shù)據(jù)、記錄中數(shù)據(jù)和表之間的數(shù)約束是通過限制字段中數(shù)據(jù)、記錄中數(shù)據(jù)和表之間的數(shù) 據(jù)來保證數(shù)據(jù)完整性據(jù)來保證數(shù)據(jù)完整性 。 約束獨立于表結(jié)構(gòu),創(chuàng)建約束有兩種方法約束獨立于表結(jié)構(gòu),創(chuàng)建約束有兩種方法 : 創(chuàng)
14、建表時在創(chuàng)建表時在CREATE TABLE命令中聲明;命令中聲明; 在不改變表結(jié)構(gòu)的基礎(chǔ)上,通過修改表結(jié)構(gòu)命令在不改變表結(jié)構(gòu)的基礎(chǔ)上,通過修改表結(jié)構(gòu)命令A(yù)LTER TABLE添加或刪除添加或刪除 。 當表被刪除時,表所帶的所有約束定義也隨之被刪除。當表被刪除時,表所帶的所有約束定義也隨之被刪除。 2021-7-121414 9.2 約束約束 表表9.2 所有可用的約束類型所有可用的約束類型 完整性類型完整性類型 約束類型約束類型 域完整性域完整性 DEFAULT(默認值默認值)、CHECK(檢檢 查查)約束約束 實體完整性實體完整性 PRIMARY KEY(主鍵主鍵)約束、約束、 UNIQUE
15、(唯一唯一)約束約束 參照完整性參照完整性 FOREIGN KEY(外鍵外鍵)約束約束 2021-7-121515 9.2 約束約束 n 主鍵約束主鍵約束 在數(shù)據(jù)表中經(jīng)常有一列或多列的組合,其值能唯一地標在數(shù)據(jù)表中經(jīng)常有一列或多列的組合,其值能唯一地標 識表中的每一行。這樣的一列或多列稱為表的主鍵識表中的每一行。這樣的一列或多列稱為表的主鍵 。 通過它可強制表的實體完整性,以確保數(shù)據(jù)表中數(shù)據(jù)的通過它可強制表的實體完整性,以確保數(shù)據(jù)表中數(shù)據(jù)的 唯一性唯一性 。 當創(chuàng)建或更改表時,可通過定義當創(chuàng)建或更改表時,可通過定義PRIMARY KEY (主鍵主鍵) 約束來創(chuàng)建主鍵。約束來創(chuàng)建主鍵。 2021
16、-7-121616 9.2 約束約束 對于主鍵約束,需滿足以下規(guī)則。對于主鍵約束,需滿足以下規(guī)則。 一個表只能包含一個一個表只能包含一個PRIMARY KEY約束。約束。 由由PRIMARY KEY約束生成的索引不會使表中的非約束生成的索引不會使表中的非 聚集索引超過聚集索引超過249個,聚集索引超過個,聚集索引超過1個。個。 如果沒有為如果沒有為PRIMARY KEY約束指定約束指定CLUSTERED 或或NONCLUSTERED,并且沒有為,并且沒有為UNIQUE約束指定約束指定 聚集索引,則將對該聚集索引,則將對該PRIMARY KEY約束使用約束使用 CLUSTERED。 在在PRIM
17、ARY KEY約束中定義的所有列都必須定義約束中定義的所有列都必須定義 為為NOT NULL。如果沒有指定為空性,則加入。如果沒有指定為空性,則加入 PRIMARY KEY約束的所有列的為空性都將設(shè)置為約束的所有列的為空性都將設(shè)置為 NOT NULL。 2021-7-121717 9.2 約束約束 (1) 創(chuàng)建表時聲明主鍵約束創(chuàng)建表時聲明主鍵約束 如果表的主鍵由單列組成,則該主鍵約束可以定義為該如果表的主鍵由單列組成,則該主鍵約束可以定義為該 列的列約束。如果主鍵由兩個以上的列組成,則該主鍵約束列的列約束。如果主鍵由兩個以上的列組成,則該主鍵約束 必須定義為表約束必須定義為表約束 。 定義列級
18、主鍵約束定義列級主鍵約束 語法格式如下:語法格式如下: CONSTRAINT constraint_name PRIMARY KEY CLUSTERED | NONCLUSTERED 2021-7-121818 9.2 約束約束 CONSTRAINT:可選關(guān)鍵字,表示:可選關(guān)鍵字,表示PRIMARY KEY、 NOT NULL、UNIQUE、FOREIGN KEY或或CHECK約束定約束定 義的開始義的開始 。 constraint_name:約束的名稱。約束名稱必須在表所屬:約束的名稱。約束名稱必須在表所屬 的架構(gòu)中唯一。的架構(gòu)中唯一。 PRIMARY KEY:是通過唯一索引對給定的一列或多
19、列:是通過唯一索引對給定的一列或多列 強制實體完整性的約束。每個表只能創(chuàng)建一個強制實體完整性的約束。每個表只能創(chuàng)建一個 PRIMARY KEY 約束約束 。 CLUSTERED | NONCLUSTERED:指示為:指示為PRIMARY KEY約束創(chuàng)建聚集索引還是非聚集索引。約束創(chuàng)建聚集索引還是非聚集索引。PRIMARY KEY 約束默認為約束默認為CLUSTERED。 2021-7-121919 9.2 約束約束 定義表級主鍵約束定義表級主鍵約束 語法格式如下。語法格式如下。 CONSTRAINT constraint_name PRIMARY KEY CLUSTERED | NONCLUS
20、TERED ( column_name ,.n ) 其中,其中,column_name ,.n 指定組成主鍵的列名,指定組成主鍵的列名,n最大最大 值為值為16。 2021-7-122020 9.2 約束約束 (2) 修改表時創(chuàng)建主鍵約束修改表時創(chuàng)建主鍵約束 語法格式如下。語法格式如下。 ALTER TABLE table_name ADD CONSTRAINT Constraint_name PRIMARY KEY CLUSTERED | NONCLUSTERED ( column_name ,n ) 2021-7-122121 9.2 約束約束 例如:假設(shè)在例如:假設(shè)在teaching數(shù)據(jù)
21、庫中的數(shù)據(jù)庫中的s_c表中沒有設(shè)置主鍵表中沒有設(shè)置主鍵 約束,以下示例通過約束,以下示例通過ALTER TABLE命令添加主鍵約束命令添加主鍵約束 。 USE teaching GO ALTER TABLE s_c ADD CONSTRAINT PK_sc PRIMARY KEY (SNO, CNO) GO 通過通過ALTER TABLE命令也可以刪除不使用的主鍵約束,命令也可以刪除不使用的主鍵約束, 命令格式如下。命令格式如下。 ALTER TABLE table_name DROP CONSTRAINT constraint_name 2021-7-122222 9.2 約束約束 n 外鍵
22、約束外鍵約束 通過將用于保存表中主鍵值的一列或多列添加到另一個通過將用于保存表中主鍵值的一列或多列添加到另一個 表中,可創(chuàng)建兩個表之間的鏈接。這個列就成為第二個表的表中,可創(chuàng)建兩個表之間的鏈接。這個列就成為第二個表的 外鍵。外鍵。 外鍵用于建立和加強兩個表數(shù)據(jù)之間的鏈接的一列或多外鍵用于建立和加強兩個表數(shù)據(jù)之間的鏈接的一列或多 列。列。 當創(chuàng)建或更改表時,可以通過定義當創(chuàng)建或更改表時,可以通過定義FOREIGN KEY約束約束 來創(chuàng)建外鍵。來創(chuàng)建外鍵。 2021-7-122323 9.2 約束約束 對于外鍵約束,需要滿足以下規(guī)則。對于外鍵約束,需要滿足以下規(guī)則。 如果在如果在FOREIGN K
23、EY約束的列中輸入非約束的列中輸入非NULL值,則此值必值,則此值必 須在被引用列中存在;否則,將返回違反外鍵約束的錯誤信息。須在被引用列中存在;否則,將返回違反外鍵約束的錯誤信息。 FOREIGN KEY約束僅能引用位于同一服務(wù)器上的同一數(shù)據(jù)約束僅能引用位于同一服務(wù)器上的同一數(shù)據(jù) 庫中的表??鐢?shù)據(jù)庫的參照完整性必須通過觸發(fā)器實現(xiàn)。庫中的表。跨數(shù)據(jù)庫的參照完整性必須通過觸發(fā)器實現(xiàn)。 FOREIGN KEY約束可引用同一表中的其他列,此行為稱為約束可引用同一表中的其他列,此行為稱為 自引用。自引用。 列級列級FOREIGN KEY約束的約束的REFERENCES子句只能列出一個子句只能列出一個
24、引用列。此列的數(shù)據(jù)類型必須與定義約束的列的數(shù)據(jù)類型相同。引用列。此列的數(shù)據(jù)類型必須與定義約束的列的數(shù)據(jù)類型相同。 表級表級FOREIGN KEY約束的約束的REFERENCES子句中引用列的數(shù)子句中引用列的數(shù) 目必須與約束列列表中的列數(shù)相同。每個引用列的數(shù)據(jù)類型也必目必須與約束列列表中的列數(shù)相同。每個引用列的數(shù)據(jù)類型也必 須與列表中相應(yīng)列的數(shù)據(jù)類型相同。須與列表中相應(yīng)列的數(shù)據(jù)類型相同。 FOREIGN KEY約束只能引用所參照的表的約束只能引用所參照的表的PRIMARY KEY 或或UNIQUE約束中的列或所引用的表上約束中的列或所引用的表上UNIQUE INDEX中的列。中的列。 2021-
25、7-122424 9.2 約束約束 (1) 創(chuàng)建表時聲明外鍵約束創(chuàng)建表時聲明外鍵約束 語法格式如下。語法格式如下。 CONSTRAINT constraint_name FOREIGN KEY REFERENCES schema_name . referenced_table_name ( ref_column ) ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT 2021-7-122525 9.2 約束約束 FOREIGN
26、KEY REFERENCES:為列中的數(shù)據(jù)提供參:為列中的數(shù)據(jù)提供參 照完整性的約束。照完整性的約束。FOREIGN KEY 約束要求列中的每個值在約束要求列中的每個值在 所引參照的表中對應(yīng)的被引用列中都存在。所引參照的表中對應(yīng)的被引用列中都存在。 schema_name . referenced_table_name:是:是FOREIGN KEY約束參照的表的名稱,以及該表所屬架構(gòu)的名稱。約束參照的表的名稱,以及該表所屬架構(gòu)的名稱。 ( ref_column ,. n ):是:是FOREIGN KEY約束所引用的約束所引用的 表中的一列或多列表中的一列或多列 。 ON DELETE NO A
27、CTION | CASCADE | SET NULL | SET DEFAULT :指定如果已創(chuàng)建表中的行具有引用關(guān)系,:指定如果已創(chuàng)建表中的行具有引用關(guān)系, 并且被引用行已從父表中刪除,則對這些行采取的操作。默并且被引用行已從父表中刪除,則對這些行采取的操作。默 認值為認值為NO ACTION。 2021-7-122626 9.2 約束約束 NO ACTION:數(shù)據(jù)庫引擎將引發(fā)錯誤,并回滾對父表中:數(shù)據(jù)庫引擎將引發(fā)錯誤,并回滾對父表中 相應(yīng)行的刪除操作。相應(yīng)行的刪除操作。 CASCADE:如果從父表中刪除一行,則將從引用表中:如果從父表中刪除一行,則將從引用表中 刪除相應(yīng)行。刪除相應(yīng)行。 S
28、ET NULL:如果父表中對應(yīng)的行被刪除,則組成外鍵:如果父表中對應(yīng)的行被刪除,則組成外鍵 的所有值都將設(shè)置為的所有值都將設(shè)置為NULL。若要執(zhí)行此約束,外鍵列必須。若要執(zhí)行此約束,外鍵列必須 可為空值??蔀榭罩怠?SET DEFAULT:如果父表中對應(yīng)的行被刪除,則組成外:如果父表中對應(yīng)的行被刪除,則組成外 鍵的所有值都將設(shè)置為默認值。若要執(zhí)行此約束,所有外鍵鍵的所有值都將設(shè)置為默認值。若要執(zhí)行此約束,所有外鍵 列都必須有默認定義。如果某列為空值,并且未設(shè)置顯式的列都必須有默認定義。如果某列為空值,并且未設(shè)置顯式的 默認值,則將使用默認值,則將使用NULL作為該列的隱式默認值。作為該列的隱式
29、默認值。 2021-7-122727 9.2 約束約束 ON UPDATE NO ACTION | CASCADE | SET NULL | SET DEFAULT :指定在發(fā)生更改的表中,如果行有引用:指定在發(fā)生更改的表中,如果行有引用 關(guān)系且引用的行在父表中被更新,則對這些行采取什么操作。關(guān)系且引用的行在父表中被更新,則對這些行采取什么操作。 默認值為默認值為NO ACTION 。 2021-7-122828 9.2 約束約束 外鍵約束不僅可以與一張表上的主鍵約束建立聯(lián)系,也外鍵約束不僅可以與一張表上的主鍵約束建立聯(lián)系,也 可以與另一張表上的可以與另一張表上的UNIQUE約束建立聯(lián)系。當一
30、行新的數(shù)約束建立聯(lián)系。當一行新的數(shù) 據(jù)被加入到表格中,或表格中已經(jīng)存在的外鍵上的數(shù)據(jù)進行據(jù)被加入到表格中,或表格中已經(jīng)存在的外鍵上的數(shù)據(jù)進行 修改時,新的數(shù)據(jù)必須存在于另一張表的主鍵上,或者為修改時,新的數(shù)據(jù)必須存在于另一張表的主鍵上,或者為 NULL 。 在外鍵約束上允許存在為在外鍵約束上允許存在為NULL的值的值 。 當主鍵所在表的數(shù)據(jù)被另一張表的外鍵所引用時,用戶當主鍵所在表的數(shù)據(jù)被另一張表的外鍵所引用時,用戶 將無法對主鍵里的數(shù)據(jù)進行修改或刪除,除非事先刪除或修將無法對主鍵里的數(shù)據(jù)進行修改或刪除,除非事先刪除或修 改引用的數(shù)據(jù)。改引用的數(shù)據(jù)。 2021-7-122929 9.2 約束約
31、束 (2) 修改表時創(chuàng)建外鍵約束修改表時創(chuàng)建外鍵約束 語法格式如下。語法格式如下。 ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY( column ,n ) REFERENCES ref_table( ref_column ,n ) 2021-7-123030 9.2 約束約束 例如:假設(shè)在例如:假設(shè)在teaching數(shù)據(jù)庫中的數(shù)據(jù)庫中的s_c表中沒有設(shè)置外鍵約束,以下示例通過表中沒有設(shè)置外鍵約束,以下示例通過 ALTER TABLE命令添加外鍵約束。命令添加外鍵約束。 USE teaching GO ALTE
32、R TABLE s_c ADD CONSTRAINT FK_sc_sno FOREIGN KEY (SNO) REFERENCES student(SNO) GO ALTER TABLE s_c ADD CONSTRAINT FK_sc_cno FOREIGN KEY (CNO) REFERENCES course(CNO) GO 通過通過ALTER TABLE命令也可以刪除不使用的外鍵約束,命令格式如下。命令也可以刪除不使用的外鍵約束,命令格式如下。 ALTER TABLE table_name DROP CONSTRAINT constraint_name,n 2021-7-123131
33、9.2 約束約束 n UNIQUE(唯一唯一)約束約束 對于數(shù)據(jù)表中非主鍵列的指定列,唯一約束確保不會輸對于數(shù)據(jù)表中非主鍵列的指定列,唯一約束確保不會輸 入重復(fù)的值。每個入重復(fù)的值。每個UNIQUE約束建立一個唯一索引。每個表約束建立一個唯一索引。每個表 中只能有一個主鍵,但是可以有多個中只能有一個主鍵,但是可以有多個UNIQUE列。唯一約束列。唯一約束 指定的列可以有指定的列可以有NULL值。表中的主鍵也強制執(zhí)行唯一性,值。表中的主鍵也強制執(zhí)行唯一性, 但主鍵不允許為但主鍵不允許為NULL,主鍵約束強度大于唯一約束。,主鍵約束強度大于唯一約束。 唯一約束需滿足以下規(guī)則。唯一約束需滿足以下規(guī)則
34、。 如果沒有為如果沒有為UNIQUE約束指定約束指定CLUSTERED或或 NONCLUSTERED,則默認使用,則默認使用NONCLUSTERED。 每個每個UNIQUE約束都生成一個索引。約束都生成一個索引。UNIQUE約束約束 的數(shù)目不會使表中的非聚集索引超過的數(shù)目不會使表中的非聚集索引超過249個,聚集索引個,聚集索引 超過超過1個。個。 2021-7-123232 9.2 約束約束 (1) 創(chuàng)建表時聲明唯一約束創(chuàng)建表時聲明唯一約束 如果表的唯一約束由單列組成,則該唯一約束可以定義如果表的唯一約束由單列組成,則該唯一約束可以定義 為該列的列約束。如果唯一約束由兩個以上的列組成,則該為該
35、列的列約束。如果唯一約束由兩個以上的列組成,則該 唯一約束必須定義為表約束。唯一約束必須定義為表約束。 定義列級主鍵約束定義列級主鍵約束 語法格式如下。語法格式如下。 CONSTRAINT constraint_name UNIQUE CLUSTERED | NONCLUSTERED UNIQUE:唯一約束:唯一約束 。 CLUSTERED | NONCLUSTERED:指示為:指示為UNIQUE約約 束創(chuàng)建聚集索引還是非聚集索引。束創(chuàng)建聚集索引還是非聚集索引。 2021-7-123333 9.2 約束約束 定義表級唯一約束定義表級唯一約束 語法格式如下。語法格式如下。 CONSTRAINT
36、constraint_name UNIQUE CLUSTERED | NONCLUSTERED ( column_name ,.n ) (2) 修改表時創(chuàng)建唯一約束修改表時創(chuàng)建唯一約束 語法格式如下。語法格式如下。 ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE( column ,n ) 2021-7-123434 9.2 約束約束 例如:以下示例將例如:以下示例將teaching數(shù)據(jù)庫中的數(shù)據(jù)庫中的student表中的姓名列設(shè)置為表中的姓名列設(shè)置為 唯一約束。唯一約束。 USE teaching GO ALTER TA
37、BLE student ADD CONSTRAINT UQ_student UNIQUE (SNAME) 通過通過ALTER TABLE命令也可以刪除不使用的唯一約束,命令格式命令也可以刪除不使用的唯一約束,命令格式 如下。如下。 ALTER TABLE table_name DROP CONSTRAINT constraint_name,n 2021-7-123535 9.2 約束約束 n 檢查約束檢查約束 檢查檢查(CHECK)約束通過檢查輸入表列的數(shù)據(jù)的值來維護約束通過檢查輸入表列的數(shù)據(jù)的值來維護 值域的完整性,它可用來指定某列可取值的清單或可取值的值域的完整性,它可用來指定某列可取值的
38、清單或可取值的 集合,也可指定某列可取值的范圍集合,也可指定某列可取值的范圍 。 可以在一列上設(shè)置多個檢查約束,也可以將一個檢查約可以在一列上設(shè)置多個檢查約束,也可以將一個檢查約 束應(yīng)用于多列。當一列受多個檢查約束控制時,所有的約束束應(yīng)用于多列。當一列受多個檢查約束控制時,所有的約束 按照創(chuàng)建的順序,依次進行數(shù)據(jù)有效性的檢查。按照創(chuàng)建的順序,依次進行數(shù)據(jù)有效性的檢查。 根據(jù)檢查約束是作用于單列還是多列,可分為列級檢查根據(jù)檢查約束是作用于單列還是多列,可分為列級檢查 約束和表級檢查約束。約束和表級檢查約束。 2021-7-123636 9.2 約束約束 對于檢查約束,需滿足以下規(guī)則。對于檢查約束
39、,需滿足以下規(guī)則。 列可以有任意多個列可以有任意多個CHECK約束,并且約束條件中可以包含用約束,并且約束條件中可以包含用 AND和和OR組合起來的多個邏輯表達式。列上的多個組合起來的多個邏輯表達式。列上的多個CHECK約束約束 按創(chuàng)建順序進行驗證。按創(chuàng)建順序進行驗證。 搜索條件必須取值為布爾表達式,并且不能引用其他表。搜索條件必須取值為布爾表達式,并且不能引用其他表。 列級列級CHECK約束只能引用被約束的列,表級約束只能引用被約束的列,表級CHECK約束只約束只 能引用同一表中的列。能引用同一表中的列。 當執(zhí)行當執(zhí)行INSERT和和DELETE語句時,語句時,CHECK 約束和規(guī)則具有約束
40、和規(guī)則具有 相同的數(shù)據(jù)驗證功能。相同的數(shù)據(jù)驗證功能。 當列上存在規(guī)則和一個或多個當列上存在規(guī)則和一個或多個CHECK約束時,將驗證所有限約束時,將驗證所有限 制。制。 不能在不能在text、ntext或或image列上定義列上定義CHECK約束。約束。 2021-7-123737 9.2 約束約束 (1)創(chuàng)建表時聲明唯一約束創(chuàng)建表時聲明唯一約束 語法格式如下。語法格式如下。 CONSTRAINT constraint_name CHECK (logical_expression) 各選項含義如下各選項含義如下 : CHECK:檢查約束。該約束通過限制可輸入一列或多:檢查約束。該約束通過限制可輸
41、入一列或多 列中的可能值來強制實現(xiàn)域完整性。列中的可能值來強制實現(xiàn)域完整性。 logical_expression:返回:返回TRUE或或FALSE的邏輯表達式。的邏輯表達式。 別名數(shù)據(jù)類型不能作為表達式的一部分別名數(shù)據(jù)類型不能作為表達式的一部分 。 2021-7-123838 9.2 約束約束 (2)修改表時創(chuàng)建檢查約束修改表時創(chuàng)建檢查約束 語法格式如下。語法格式如下。 ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK(logical_expression) 2021-7-123939 9.2 約束約束 例如:假設(shè)在例如:
42、假設(shè)在teaching數(shù)據(jù)庫中的數(shù)據(jù)庫中的s_c表中沒有設(shè)置對成績列的檢查表中沒有設(shè)置對成績列的檢查 約束,以下示例通過約束,以下示例通過ALTER TABLE命令添加檢查約束命令添加檢查約束 。 USE teaching GO ALTER TABLE s_c ADD CONSTRAINT CK_sc CHECK(GRADE=0 AND GRADE=0 and Grade=100 GO 2021-7-124646 9.3 規(guī)則規(guī)則 n 查看規(guī)則查看規(guī)則 可以使用系統(tǒng)存儲過程可以使用系統(tǒng)存儲過程sp_helptext查看已經(jīng)創(chuàng)建的規(guī)則,查看已經(jīng)創(chuàng)建的規(guī)則, 語法格式如下。語法格式如下。 sp_h
43、elptext objname= object_name 其中:其中: objname=object_name:指定對象的名稱。:指定對象的名稱。 例如:以下示例查看已經(jīng)創(chuàng)建的規(guī)則例如:以下示例查看已經(jīng)創(chuàng)建的規(guī)則grade_rule。 USE teaching GO EXEC sp_helptext grade_rule GO 執(zhí)行結(jié)果如圖執(zhí)行結(jié)果如圖9.1所示所示 。 2021-7-124747 9.3 規(guī)則規(guī)則 n 綁定與解除規(guī)則綁定與解除規(guī)則 1. 綁定規(guī)則綁定規(guī)則 創(chuàng)建好一個規(guī)則后,必須通過綁定才能使用規(guī)則,一般創(chuàng)建好一個規(guī)則后,必須通過綁定才能使用規(guī)則,一般 情況下,規(guī)則可以綁定在用
44、戶自定義數(shù)據(jù)類型或是數(shù)據(jù)列中。情況下,規(guī)則可以綁定在用戶自定義數(shù)據(jù)類型或是數(shù)據(jù)列中。 綁定規(guī)則可以使用存儲過程綁定規(guī)則可以使用存儲過程sp_bindrule,語法格式如下,語法格式如下 : sp_bindrule rulename=rule, objname=object_name rulename=rule:指定規(guī)則名稱:指定規(guī)則名稱 。 objname=object_name:指定規(guī)則綁定的對象:指定規(guī)則綁定的對象 。 2021-7-124848 9.3 規(guī)則規(guī)則 如果規(guī)則綁定的對象是表的列,則如果規(guī)則綁定的對象是表的列,則object_name的格式是的格式是 table.column,
45、否則認為是用戶定義數(shù)據(jù)類型。,否則認為是用戶定義數(shù)據(jù)類型。 例如:以下示例將例例如:以下示例將例9.7創(chuàng)建的規(guī)則創(chuàng)建的規(guī)則grade_rule綁定到綁定到 teaching數(shù)據(jù)庫中的數(shù)據(jù)庫中的s_c表中的表中的GRADE列上列上 。 USE teaching GO EXEC sp_bindrule grade_rule,s_c.GRADE GO 2021-7-124949 9.3 規(guī)則規(guī)則 2. 解除規(guī)則解除規(guī)則 系統(tǒng)存儲過程系統(tǒng)存儲過程sp_unbindrule用于當前數(shù)據(jù)庫中為列或用用于當前數(shù)據(jù)庫中為列或用 戶定義數(shù)據(jù)類型解除規(guī)則綁定戶定義數(shù)據(jù)類型解除規(guī)則綁定 。 語法格式如下。語法格式如
46、下。 sp_unbindrule objname=object_name 例如:解除綁定在例如:解除綁定在teaching數(shù)據(jù)庫中的數(shù)據(jù)庫中的s_c表中表中GRADE列列 上的規(guī)則上的規(guī)則 。 USE teaching GO EXEC sp_unbindrule s_c.GRADE GO 2021-7-125050 9.3 規(guī)則規(guī)則 n 刪除規(guī)則刪除規(guī)則 從數(shù)據(jù)庫中刪除一個規(guī)則值時,可以分為以下兩種情況從數(shù)據(jù)庫中刪除一個規(guī)則值時,可以分為以下兩種情況 來處理。來處理。 如果這個規(guī)則尚未綁定到表或用戶定義數(shù)據(jù)類型上,可如果這個規(guī)則尚未綁定到表或用戶定義數(shù)據(jù)類型上,可 以使用以使用DROP RUL
47、E語句來刪除。語句來刪除。 如果已經(jīng)將這個規(guī)則綁定到表或用戶定義數(shù)據(jù)類型上,如果已經(jīng)將這個規(guī)則綁定到表或用戶定義數(shù)據(jù)類型上, 必須首先使用系統(tǒng)存儲過程必須首先使用系統(tǒng)存儲過程sp_unbindrule來解除該規(guī)則在表來解除該規(guī)則在表 列或用戶定義數(shù)據(jù)類型上的綁定,然后使用列或用戶定義數(shù)據(jù)類型上的綁定,然后使用DROP RULE語語 句刪除該規(guī)則。句刪除該規(guī)則。 2021-7-125151 9.3 規(guī)則規(guī)則 可以使用可以使用Transact-SQL命令的命令的DROP RULE語句從數(shù)據(jù)語句從數(shù)據(jù) 庫刪除一個或多個規(guī)則庫刪除一個或多個規(guī)則 。 其語法格式如下。其語法格式如下。 DROP RULE
48、 rule_name,n 例如:刪除例如:刪除teaching數(shù)據(jù)庫中的規(guī)則數(shù)據(jù)庫中的規(guī)則grade_rule 。 USE teaching GO DROP RULE grade_rule GO 2021-7-125252 9.4 默認值默認值 默認值就是當用戶未指定時由默認值就是當用戶未指定時由SQL Server自動指派的數(shù)自動指派的數(shù) 據(jù)值,它可以是常量、內(nèi)置函數(shù)或表達式據(jù)值,它可以是常量、內(nèi)置函數(shù)或表達式 。 使用默認值有兩種方式使用默認值有兩種方式 : 在在CREATE TABLE語句中對列定義一個語句中對列定義一個DEFAULT約束約束 使用使用CREATE DEFAULT語句在數(shù)
49、據(jù)庫中創(chuàng)建一個默認語句在數(shù)據(jù)庫中創(chuàng)建一個默認 值對象,然后使用值對象,然后使用sp_binddefault系統(tǒng)存儲過程將該對象綁系統(tǒng)存儲過程將該對象綁 定到表列上定到表列上 。 2021-7-125353 9.4 默認值默認值 n 創(chuàng)建默認值創(chuàng)建默認值 1. 創(chuàng)建默認值對象可以使用創(chuàng)建默認值對象可以使用Transact-SQL命令命令CREATE DEFAULT語句來完成語句來完成 。 語法格式如下。語法格式如下。 CREATE DEFAULT default_name AS constant_expression 其中:其中: constant_expression可以是常量表達式、任何常量
50、、內(nèi)置可以是常量表達式、任何常量、內(nèi)置 函數(shù)或數(shù)學(xué)表達式,但不能包含任何列或其他數(shù)據(jù)庫對象的函數(shù)或數(shù)學(xué)表達式,但不能包含任何列或其他數(shù)據(jù)庫對象的 名稱。名稱。 2021-7-125454 9.4 默認值默認值 例如:在例如:在teaching數(shù)據(jù)庫中創(chuàng)建一個名為數(shù)據(jù)庫中創(chuàng)建一個名為grade_default的的 默認值,并以默認值,并以0作為其值。作為其值。 USE teaching GO CREATE DEFAULT grade_default AS 0 GO 2021-7-125555 9.4 默認值默認值 2. 可以使用系統(tǒng)存儲過程可以使用系統(tǒng)存儲過程sp_helptext查看默認值定義
51、,查看默認值定義, 語法格式如下。語法格式如下。 sp_helptext objname = name name為用戶定義的對象名稱。僅當指定限定對象時才需為用戶定義的對象名稱。僅當指定限定對象時才需 要引號。對象必須在當前數(shù)據(jù)庫中要引號。對象必須在當前數(shù)據(jù)庫中 。 例如:查看已經(jīng)創(chuàng)建的默認值例如:查看已經(jīng)創(chuàng)建的默認值grade_default。 USE teaching GO EXEC sp_helptext grade_default GO 執(zhí)行結(jié)果如圖執(zhí)行結(jié)果如圖9.2所示所示 2021-7-125656 9.4 默認值默認值 n 綁定與解除默認值綁定與解除默認值 1. 綁定默認值綁定默
52、認值 在數(shù)據(jù)庫中創(chuàng)建一個默認值后,還必須把該默認值綁定在數(shù)據(jù)庫中創(chuàng)建一個默認值后,還必須把該默認值綁定 到列或用戶定義數(shù)據(jù)類型上才能讓它發(fā)揮作用。到列或用戶定義數(shù)據(jù)類型上才能讓它發(fā)揮作用。 可以用系統(tǒng)存儲過程可以用系統(tǒng)存儲過程sp_binddefault來完成來完成 ,其語法格式,其語法格式 如下如下 : sp_bindefault defname=default,objname=object_name 2021-7-125757 9.4 默認值默認值 例如:以下示例將例例如:以下示例將例9.14創(chuàng)建的默認值創(chuàng)建的默認值grade_default綁定綁定 到到teaching數(shù)據(jù)庫中的數(shù)據(jù)庫中的s_c表中表中GRADE列上列上 。 USE teaching GO EXEC sp_bindefault grade_default,s_c.GRADE G
溫馨提示
- 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024浙教版信息技術(shù)六年級上冊《第11課 韓信點兵篩選法的實現(xiàn)》教學(xué)設(shè)計
- 2025年度網(wǎng)絡(luò)設(shè)備安全性能測試代理合同
- 幾百幾十加減幾百幾十單元測驗習(xí)題帶答案
- 第二章第二節(jié)《簡單的程序設(shè)計》教學(xué)設(shè)計 2023-2024學(xué)河大音像版(2020)初中信息技術(shù)八年級下冊
- 9《浣溪沙》(教學(xué)設(shè)計)-2023-2024學(xué)年統(tǒng)編版語文六年級下冊
- Module 4 Unit 2(1)(教學(xué)設(shè)計)-2023-2024學(xué)年外研版英語八年級下冊
- 2025年回轉(zhuǎn)換熱干燥技術(shù)與設(shè)備項目合作計劃書
- 全國青島版信息技術(shù)八年級上冊專題二第3課《閱讀材料 機器人未來的發(fā)展趨勢》教學(xué)設(shè)計
- 2025年易拉罐警報器項目投資可行性研究分析報告
- 10 《勸學(xué)》 (教學(xué)設(shè)計)-2024-2025學(xué)年高一語文同步教學(xué)設(shè)計與知識梳理(統(tǒng)編版必修上冊)
- 2025屆上海市寶山區(qū)行知中學(xué)物理高一第一學(xué)期期末檢測試題含解析
- 流感課件名稱教學(xué)課件
- 電力工程施工售后保障方案
- 學(xué)生課業(yè)發(fā)展的測量與評價
- 二年級上冊勞動《理床鋪》課件
- 雷達原理第6版丁鷺飛課后參考答案
- 多源數(shù)據(jù)整合
- 新人教版高中數(shù)學(xué)必修第二冊第六章平面向量及其應(yīng)用教案 (一)
- 《預(yù)防流感》主題班會教案3篇
- 廣西海綿城市規(guī)劃設(shè)計導(dǎo)則征求意見稿
- 校園招聘活動策劃方案(6篇)
評論
0/150
提交評論