




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、6.1完整性的概念完整性的概念 6.2 約束的類型約束的類型 6.3 約束的創(chuàng)建約束的創(chuàng)建 6.4 查看約束的定義查看約束的定義 6.5 刪除約束刪除約束 6.6 使用規(guī)則使用規(guī)則 6.7 使用默認(rèn)使用默認(rèn) 6.8 數(shù)據(jù)完整性強(qiáng)制選擇方法數(shù)據(jù)完整性強(qiáng)制選擇方法 6.9 應(yīng)應(yīng) 用用 舉舉 例例6.9 應(yīng)應(yīng) 用用 舉舉 例例 第5章介紹了數(shù)據(jù)庫的基本操作,對于數(shù)據(jù)的添加、刪除、修改操作都可能對數(shù)據(jù)庫中的數(shù)據(jù)造成破壞或出現(xiàn)相關(guān)數(shù)據(jù)不一致的現(xiàn)象。要保證數(shù)據(jù)的正確無誤和相關(guān)數(shù)據(jù)的一致性,除了認(rèn)真地進(jìn)行操作外,更重要的是數(shù)據(jù)庫系統(tǒng)本身需要提供維護(hù)機(jī)制。 數(shù)據(jù)庫中的數(shù)據(jù)是從外界輸入的,由于種種原因,可能會輸
2、入無效或錯誤的信息。保證輸入的數(shù)據(jù)符合規(guī)定,是數(shù)據(jù)庫系統(tǒng)尤其是多用戶的關(guān)系數(shù)據(jù)庫系統(tǒng)首要關(guān)注的問題。數(shù)據(jù)完整性因此而提出。本章將講述數(shù)據(jù)完整性的概念及其在SQL Server中的實(shí)現(xiàn)方法。6.1完整性的概念完整性的概念 SQL Server 2005文檔中將數(shù)據(jù)完整性解釋為:存儲在數(shù)據(jù)庫中的所有數(shù)據(jù)值均正確。如果數(shù)據(jù)庫中存儲有不正確的數(shù)據(jù)值,則該數(shù)據(jù)庫稱為已喪失數(shù)據(jù)完整性。數(shù)據(jù)完整性(data integrity)是指數(shù)據(jù)的精確性(accuracy)和可靠性(reliability)。它是應(yīng)防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯誤信息的輸入/輸出造成無效操作或錯誤信息而提出的。例如:在
3、student數(shù)據(jù)庫中,“學(xué)生”表中有“學(xué)號”、“姓名”、“性別”、“出生日期”、“入學(xué)時間”、“班級代碼”、“系部代碼”和“專業(yè)代碼”等8個字段,各個字段的數(shù)據(jù)類型都有規(guī)定。在這張表中,每個學(xué)生(也就是每條記錄)“學(xué)號”字段不能有重復(fù),也就是說每個學(xué)生都應(yīng)該有唯一的學(xué)號,不能有兩個或多個學(xué)生的學(xué)號相同;“性別”字段中的數(shù)據(jù)只能為“男”或“女”,不能有其他數(shù)據(jù)填入;“出生日期”、“入學(xué)時間”、“班級代碼”、“系部代碼”和“專業(yè)代碼”字段必須有值,不能為空。這時,由于數(shù)據(jù)的錯誤或應(yīng)用程序的錯誤就會導(dǎo)致數(shù)據(jù)的不正確性和不符合規(guī)定的現(xiàn)象發(fā)生。研究數(shù)據(jù)完整性就是為了避免這樣的問題產(chǎn)生。數(shù)據(jù)完整性分為四
4、類:實(shí)體完整性(entity integrity)、域完整性(domain integrity)、參照完整性(referential integrity)、用戶定義的完整性(user-defined integrity)。1實(shí)體完整性實(shí)體完整性實(shí)體完整性(entity integrity)規(guī)定表中的每一行在表中是唯一的實(shí)體。也可以這樣說,在表中不能存在完全相同的記錄,而且每條記錄都要有一個非空并且不重復(fù)的主鍵。主鍵的存在保證了任何記錄都是不重復(fù)的,可以區(qū)分,在對數(shù)據(jù)進(jìn)行操作時才可以和其他記錄區(qū)分開。例如,要對“學(xué)生”表中姓名為“張斌”的記錄進(jìn)行更改,針對更新這個操作只能針對“張斌”這個人(這條
5、記錄),那么選擇查詢或操作的時候就只能靠學(xué)號的唯一性來判斷,而其他字段的內(nèi)容可能與其他記錄產(chǎn)生重復(fù)。表中定義的PRIMARY KEY和IDENTITY約束就是實(shí)體完整性的體現(xiàn)。2域完整性域完整性域完整性(domain integrity)是指數(shù)據(jù)庫表中的字段必須滿足某種特定的數(shù)據(jù)類型或約束。其中,約束又包括取值范圍、精度等規(guī)定。例如,在“學(xué)生”表中,“學(xué)號”字段內(nèi)容只能填入規(guī)定長度的學(xué)號,而“性別”字段只能填入“男”或“女”,“出生日期”和“入學(xué)時間”只能填入日期類型數(shù)據(jù)。表中的CHECK、FOREIGN KEY 約束和DEFAULT、NOT NULL定義都屬于域完整性的范疇。3參照完整性參照
6、完整性參照完整性(referential integrity)是指兩個表的主鍵和外鍵的數(shù)據(jù)應(yīng)對應(yīng)一致。它確保了有主鍵的表中對應(yīng)其他表的外鍵的存在,即保證了表之間數(shù)據(jù)的一致性,防止了數(shù)據(jù)丟失或無意義的數(shù)據(jù)在數(shù)據(jù)庫中擴(kuò)散。參照完整性是建立在外鍵和主鍵之間或外鍵和唯一性關(guān)鍵字之間的關(guān)系上的。例如,在“學(xué)生”表中的“系部代碼”的值必須是在“系部”表中存在的值。在SQL Server 2005中,參照完整性作用表現(xiàn)在如下三個方面:(1)禁止在從表中插入包含主表中不存在的關(guān)鍵字的數(shù)據(jù)行。(2)禁止會導(dǎo)致從表中相應(yīng)值孤立的主表中的外鍵值改變。(3)禁止刪除在從表中有對應(yīng)記錄的主表記錄。4用戶定義的完整性用戶
7、定義的完整性不同的關(guān)系數(shù)據(jù)庫系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性(user-defined integrity)即是針對某個特定關(guān)系數(shù)據(jù)庫的約束條件,它反映了某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語義要求。SQL Server 2005提供了定義和檢驗這類完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)方法來處理它們,而不是用應(yīng)用程序來承擔(dān)這一功能。其他的完整性類型都支持用戶定義的完整性。6.26.2約束的類型約束的類型 微軟文檔中將約束解釋為:約束使您得以定義Microsoft SQL Server 2005自動強(qiáng)制數(shù)據(jù)庫完整性的方式。約束定義關(guān)于字段中允許值的規(guī)則,是強(qiáng)制完整
8、性的標(biāo)準(zhǔn)機(jī)制。使用約束優(yōu)先于使用觸發(fā)器、規(guī)則和默認(rèn)值。查詢優(yōu)化器也使用約束定義生成高性能的查詢執(zhí)行計劃。約束就是一種強(qiáng)制性的規(guī)定,在SQL Server 2005中提供的約束是通過定義字段的取值規(guī)則來維護(hù)數(shù)據(jù)完整性的。嚴(yán)格說來,在SQL Server 2005中支持六類約束:NOT NULL(非空)約束、CHECK(檢查)約束、UNIQUE(唯一)約束、PRIMARY KEY(主鍵)約束.FOREIGN KEY(外鍵)約束和DEFAULT(默認(rèn))約束。下面分別進(jìn)行介紹。1NOT NULL指定不接受指定不接受NULL值的列值的列非空約束用來強(qiáng)制數(shù)據(jù)的域完整性,它用來設(shè)定某列值不能為空。例如,在“
9、學(xué)生”表中,“學(xué)號”字段值不能為空,在插入記錄的時候這個字段里必須有值存在。2CHECK約束對可以放入列中的值進(jìn)行限制,以強(qiáng)約束對可以放入列中的值進(jìn)行限制,以強(qiáng)制執(zhí)行域的完整性制執(zhí)行域的完整性CHECK約束指定應(yīng)用于列中輸入的所有值的布爾(取值為TRUE或FALSE)搜索條件,拒絕所有不取值為TRUE的值??梢詾槊苛兄付ǘ鄠€CHECK約束。 3UNIQUE約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一性約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一性對于UNIQUE約束中的列,表中不允許有兩行包含相同的非空值。主鍵也強(qiáng)制執(zhí)行唯一性,但主鍵不允許空值。主鍵約束優(yōu)先于唯一索引。例如,在“系部”表中可以將“系部代碼”作為主鍵,用來保證
10、記錄的唯一性 。4PRIMARY KEY約束標(biāo)識列或列集,這些列或列約束標(biāo)識列或列集,這些列或列集的值唯一標(biāo)識表中的行集的值唯一標(biāo)識表中的行在一個表中,不能有兩行包含相同的主鍵值。不能在主鍵內(nèi)的任何列中輸入空值。在數(shù)據(jù)庫中“空”是特殊值,代表不同于空白和 0 值的未知值。建議使用一個小的整數(shù)列作為主鍵。每個表都應(yīng)有一個主鍵。例如,要在“學(xué)生”表中區(qū)分每一個學(xué)生,區(qū)分的唯一標(biāo)志不是姓名,也不是出生日期,更不能是班級,而是每個學(xué)生唯一對應(yīng)的“學(xué)號”值,“學(xué)號”在表中就應(yīng)該設(shè)為主鍵。5FOREIGN KEY約束標(biāo)識表之間的關(guān)系約束標(biāo)識表之間的關(guān)系外鍵是在一個數(shù)據(jù)表中的一個列或多個列,它不應(yīng)該是該表的
11、主鍵,但是它可以是其他表的主鍵。一個表的外鍵指向另一個表的候選鍵。當(dāng)外鍵值沒有候選鍵時,外鍵可防止操作保留帶外鍵值的行。例如,在“學(xué)生”表中,“系部代碼”字段的值不是該表的主鍵,而它卻是“系部”表的主鍵。利用外鍵可以維護(hù)數(shù)據(jù)表之間的關(guān)系。 6 6DEFAULTDEFAULT約束為列填入默認(rèn)值約束為列填入默認(rèn)值利用默認(rèn)值可以為未填入值的列強(qiáng)制填入一個默認(rèn)情況下的值。例如,對“學(xué)生”表中的性別列,如未填入任何值則可把性別默認(rèn)填入“男”。約束可以是列約束或表約束:約束被指定為列定義的一部分,并且僅適用于那個列。約束的聲明與列的定義無關(guān),可以適用于表中一個以上的列。 當(dāng)一個約束中必須包含一個以上的列時
12、,必須使用表約束。 6.36.3約束的創(chuàng)建約束的創(chuàng)建 6.3.16.3.1創(chuàng)建主鍵約束創(chuàng)建主鍵約束 6.3.26.3.2創(chuàng)建唯一約束創(chuàng)建唯一約束 6.3.36.3.3創(chuàng)建檢查約束創(chuàng)建檢查約束 6.3.46.3.4創(chuàng)建默認(rèn)約束創(chuàng)建默認(rèn)約束 6.3.56.3.5創(chuàng)建外鍵約束創(chuàng)建外鍵約束 6.3.16.3.1創(chuàng)建主鍵約束創(chuàng)建主鍵約束 1用對象資源管理器創(chuàng)建主鍵約束用對象資源管理器創(chuàng)建主鍵約束下面以下面以“學(xué)生學(xué)生”表為例,介紹使用對象資源管理器創(chuàng)表為例,介紹使用對象資源管理器創(chuàng)建主鍵約束的操作步驟:建主鍵約束的操作步驟:(1 1)在)在“對象資源管理器對象資源管理器”窗格中依次展開窗格中依次展開“服
13、務(wù)服務(wù)器器”、“數(shù)據(jù)庫數(shù)據(jù)庫”、“student”student”、“表表”結(jié)點(diǎn)。結(jié)點(diǎn)。找到需要修改的表名(這里為找到需要修改的表名(這里為“學(xué)生學(xué)生”表),右表),右擊該表,在彈出的快捷菜單中選擇擊該表,在彈出的快捷菜單中選擇“修改修改”命令,命令,如圖如圖6-16-1所示。所示。(2 2)在)在“表設(shè)計器表設(shè)計器”窗口中,選擇需要設(shè)為主鍵的窗口中,選擇需要設(shè)為主鍵的字段,如果需要選擇多個字段,可按住【字段,如果需要選擇多個字段,可按住【CtrlCtrl】鍵再選擇其他列鍵再選擇其他列。 (3)選擇好后,右擊該字段,從彈出的快捷菜單中選擇“設(shè)置主鍵”命令,如圖6-2所示,或單擊工具欄中的“設(shè)置
14、主鍵”按鈕 。 圖6-2 選擇“設(shè)置主鍵”命令 圖6-1 選擇“修改”命令 執(zhí)行完命令后,在該列前面會出現(xiàn)鑰匙圖樣,說明主鍵設(shè)置成功,如圖6-3所示。 圖6-3 主鍵設(shè)置成功(5)設(shè)置完成主鍵后,關(guān)閉“表設(shè)計器”窗口。注意:因為主鍵是唯一的,所以表中的列原來有數(shù)據(jù),并且數(shù)據(jù)有重復(fù),那么在設(shè)置主鍵時會出現(xiàn)錯誤。如圖6-4所示,學(xué)號第一條和第四條記錄相同。圖6-4 數(shù)據(jù)重復(fù)在設(shè)置主鍵的時候會出現(xiàn)如圖6-5所示的錯誤提示。圖6-5 錯誤提示 2. 2. 使用使用SQLSQL語句創(chuàng)建主鍵約束語句創(chuàng)建主鍵約束使用SQL語句創(chuàng)建主鍵,可以用CREATE TABLE命令在創(chuàng)建表的同時完成,也可以用ALTER
15、 TABLE命令為已經(jīng)存在的表創(chuàng)建主鍵約束,語法格式如下:ALTER TABLE table_nameADDCONSTRAINT constraint_namePRIMARY KEY CLUSTERED|NONCLUSTERED(column,n)其中: constraint_name指主鍵約束名稱; CLUSTERED表示在該列上建立聚集索引; NOCLUSTERED表示在該列上建立非聚集索引。下面分別使用建表命令和修改表命令創(chuàng)建主鍵約束。 【例6.1】在student數(shù)據(jù)庫中,建立一個“教材”表,將“教材代碼”設(shè)置為主鍵。“教材”表結(jié)構(gòu)如表6-1所示。表6-1 “教材”表結(jié)構(gòu)字 段 名 稱
16、 數(shù) 據(jù) 類 型 字 段 長 度 是 否 為 空 教材代碼 char 9否 教材名稱 varchar 30是 書號 char 12是 出版社 varchar 30是 版本 char 10是 單價 tinyint 是 代碼如下:USE studentGOCREATE TABLE 教材(教材代碼 char(9) CONSTRAINT pk_jcdm PRIMARY KEY, 教材名稱 varchar(30), 書號 char(12), 出版社 varchar(30), 版本 char(10), 單價 tinyint)GO【例6.2】如果在創(chuàng)建“教材”表時沒有指定主鍵,可在創(chuàng)建好后的“教材”表中,將
17、“教材代碼”設(shè)置為主鍵。代碼如下:USE studentGOALTER TABLE 教材ADD CONSTRAINT pk_jcdmPRIMARY KEY CLUSTERED (教材代碼)GO在對象資源管理器中可以看到如圖6-6所示的主鍵創(chuàng)建好的效果。圖6-6 主鍵已創(chuàng)建好 6.3.2創(chuàng)建唯一約束創(chuàng)建唯一約束 在一張數(shù)據(jù)表中,有時除主鍵需要具有唯一性外,在一張數(shù)據(jù)表中,有時除主鍵需要具有唯一性外,還有其他列也需要具有唯一性。例如,在還有其他列也需要具有唯一性。例如,在“系系部部”表中,主鍵為表中,主鍵為“系部代碼系部代碼”,但是另外一,但是另外一個字段個字段“系部名稱系部名稱”雖不是主鍵,也需
18、保證它雖不是主鍵,也需保證它的唯一性,這時就需要創(chuàng)建表中的唯一約束。的唯一性,這時就需要創(chuàng)建表中的唯一約束。1 1使用對象資源管理器創(chuàng)建唯一約束使用對象資源管理器創(chuàng)建唯一約束下面以下面以“系部系部”表為例,為表為例,為“系部名稱系部名稱”字段創(chuàng)建字段創(chuàng)建唯一約束。操作步驟如下:唯一約束。操作步驟如下:(1 1)在)在“對象資源管理器對象資源管理器”窗格中,右擊需要設(shè)窗格中,右擊需要設(shè)置唯一約束的表(本例為置唯一約束的表(本例為“系部系部”表),在彈表),在彈出的快捷菜單中選擇出的快捷菜單中選擇“修改修改”命令,打開命令,打開“表表設(shè)計器設(shè)計器”窗口。窗口。(2)在“表設(shè)計器”窗口中,右擊需要設(shè)
19、置為唯一約束的字段(本例為“系部名稱”字段),在彈出的快捷菜單中選擇“索引/鍵”命令,如圖6-7所示,也可以直接單擊工具欄中的“管理索引和鍵”按鈕,打開“索引/鍵”對話框,如圖6-8所示。圖6-7 選擇“索引/鍵”命令圖6-8 “索引/鍵”對話框(3)在打開的“索引/鍵”對話框中,單擊“添加”按鈕,結(jié)果如圖6-9所示。圖6-9 單擊“添加”按鈕創(chuàng)建唯一約束(4)設(shè)置好相關(guān)選項后,單擊“關(guān)閉”按鈕,完成唯一約束的創(chuàng)建。這時,不只是該表的主鍵必須為唯一,并且被設(shè)置為唯一約束的字段同樣也必須為唯一。2使用SQL語句創(chuàng)建唯一約束 為已經(jīng)存在的表創(chuàng)建唯一約束,其語法格式如下: ALTER TABLE t
20、able_nameADDCONSTRAINT constraint_nameUNIQUE CLUSTERED|NONCLUSTERED(column,n)其中: table_name為需要創(chuàng)建唯一約束的表名稱; constraint_name為唯一約束的名稱; column是表中需要創(chuàng)建唯一約束的字段名稱 【例6.3】在student數(shù)據(jù)庫的“教材”表中,為“書號”字段創(chuàng)建唯一約束。代碼如下:USE studentGOALTER TABLE 教材ADD CONSTRAINT uk_shUNIQUE NONCLUSTERED (書號)GO執(zhí)行完上述SQL語句后,可以打開“索引/鍵”對話框重新查看
21、該表的唯一約束,如圖6-10所示。圖6-10 表的唯一約束可以看到,剛才的SQL語句起了作用,將書號字段創(chuàng)建了一個名稱為uk_sh的唯一約束。6.3.36.3.3創(chuàng)建檢查約束創(chuàng)建檢查約束 檢查約束對輸入的數(shù)據(jù)的值做檢查,可以限定數(shù)據(jù)輸入,從而維護(hù)數(shù)據(jù)的域完整性。例如,對“課程”表中“學(xué)分”字段的內(nèi)容,只允許為17分,不允許小于1分的學(xué)分和大于7分的學(xué)分出現(xiàn)。可以利用對象資源管理器或SQL語句來創(chuàng)建檢查約束。1使用對象資源管理器創(chuàng)建檢查約束 下面以“課程”表為例,介紹如何對“學(xué)分”字段內(nèi)容創(chuàng)建檢查約束。操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要設(shè)置唯一約束的表(本例為“課程”表),
22、在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計器”窗口。(2)在“表設(shè)計器”窗口中右擊需要創(chuàng)建檢查約束的字段(本例為“學(xué)分”字段),在彈出的快捷菜單中選擇“CHECK約束”命令,如圖6-11所示,打開“CHECK約束”對話框。 圖6-11 選擇“CHECK約束”命令 (3)在“CHECK約束”對話框中,單擊“添加”按鈕,然后在“(名稱)”文本框中輸入檢查約束名稱,在約束“表達(dá)式”文本框中輸入約束條件,這里輸入“(學(xué)分=1 AND 學(xué)分01/01/1978 AND 入學(xué)時間GETDATE()GO 6.3.46.3.4創(chuàng)建默認(rèn)約束創(chuàng)建默認(rèn)約束 在用戶輸入某些數(shù)據(jù)時,希望一些數(shù)據(jù)在沒有特例的情況下
23、被自動輸入,例如,學(xué)生的注冊日期應(yīng)該是數(shù)據(jù)錄入的當(dāng)天日期;學(xué)生的修學(xué)年限是固定的值;學(xué)生性別默認(rèn)是“男”等情況,這個時候需要對數(shù)據(jù)表創(chuàng)建默認(rèn)約束。下面分別用例子說明如何在對象資源管理器中和利用SQL語句創(chuàng)建默認(rèn)約束。1使用對象資源管理器創(chuàng)建默認(rèn)約束下面以“學(xué)生”表為例,在“性別”字段創(chuàng)建默認(rèn)為“男”的默認(rèn)約束。操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要創(chuàng)建默認(rèn)約束的表(這里為“學(xué)生”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計器”窗口。(2)選擇需要創(chuàng)建默認(rèn)約束的字段(這里為“性別”字段),然后在下方的“列屬性”選項卡中的“默認(rèn)值或綁定”文本框中輸入默認(rèn)值,本例為選擇“
24、性別”字段,在默認(rèn)值中輸入“男”,如圖6-13所示。 圖6-13 輸入默認(rèn)值注意注意:單引號不需要輸入,在表保存后,在單引號外還會自動生成一對小括號。(3)關(guān)閉“表設(shè)計器”窗口。 2. 2. 使用使用SQLSQL語句創(chuàng)建默認(rèn)約束語句創(chuàng)建默認(rèn)約束在創(chuàng)建表的同時,可以對創(chuàng)建的表中的字段創(chuàng)建默認(rèn)約束,如例6.6。【例6.6】在student數(shù)據(jù)庫中新建“學(xué)生注冊”表,并將“注冊時間”設(shè)置為當(dāng)前日期。代碼如下:USE studentGOCREATE TABLE 學(xué)生注冊(注冊編碼 int PRIMARY KEY, 學(xué)號 char(12), 注冊時間 datetime DEFAULT GETDATE()
25、, 學(xué)期 tinyint,)GO當(dāng)然,使用SQL語句同樣可以為已存在的表創(chuàng)建默認(rèn)約束。其語法格式如下:ALTER TABLE table_nameADD CONSTRAINT constraint_nameDEFAULT constraint_expressionFOR column_name其中: table_name是需要創(chuàng)建默認(rèn)約束的表名稱。 constraint_name是默認(rèn)約束名稱。 constraint_expression是默認(rèn)值。 FOR column_name是需要創(chuàng)建默認(rèn)約束的字段名稱?!纠?.7】在student數(shù)據(jù)庫中的“教師”表中,為“學(xué)歷”字段創(chuàng)建默認(rèn)值為“本科”
26、的默認(rèn)約束。代碼如下:USE studentGOALTER TABLE 教師ADD CONSTRAINT df_xlDEFAULT 本科 FOR 學(xué)歷GO6.3.56.3.5創(chuàng)建外鍵約束創(chuàng)建外鍵約束 外鍵是用來維護(hù)表與表之間對應(yīng)唯一關(guān)系的一種方法。可以利用對象資源管理器或SQL語句來創(chuàng)建外鍵約束。1使用對象資源管理器創(chuàng)建外鍵約束 下面以“教師”表為例,為“系部代碼”創(chuàng)建外鍵約束。操作步驟如下: (1)在“對象資源管理器”窗格中,右擊需要創(chuàng)建外鍵約束的表(這里為“教師”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計器”窗口。 (2)選擇需要創(chuàng)建外鍵約束的字段(這里為“系部代碼”字段),單
27、擊工具欄中的“關(guān)系”按鈕,或右擊該字段,在彈出的快捷菜單中選擇“關(guān)系”命令,打開“外鍵關(guān)系”對話框,如圖6-14所示。 圖6-14 “外鍵關(guān)系”對話框(3)在“外鍵關(guān)系”對話框中,單擊“添加”按鈕,然后單擊“表和列規(guī)范”的按鈕,打開“表和列”對話框。在“主鍵表”下拉列表中選擇“系部”表,在“外鍵表”的下拉列表框中選擇“教師”表,分別在“主鍵表”和“外鍵表”的下面選擇“系部代碼”字段,如圖6-15所示。 圖6-15 “表和列”對話框(4)單擊“確定”按鈕,然后在“外鍵關(guān)系”對話框中進(jìn)行相關(guān)設(shè)置后單擊“關(guān)閉”按鈕即可。2. 2. 使用使用SQLSQL語句創(chuàng)建外鍵約束語句創(chuàng)建外鍵約束使用SQL語句創(chuàng)
28、建外鍵約束的語法格式為: ALTER TABLE table_name ADD CONTRAINT constraint_name FOREIGN KEY(column_name,n) REFERENCES ref_table(ref_column_name,n)其中: table_name是需要創(chuàng)建外鍵約束的表名稱。 constraint_name是外鍵約束名稱。 【例6.8】在student數(shù)據(jù)庫中的“班級”表中,為“專業(yè)代碼”字段創(chuàng)建一個外鍵約束,從而保證輸入有效的專業(yè)代碼。代碼如下:USE studentGOALTER TABLE 班級ADD CONSTRAINT fk_zydmFOR
29、EIGN KEY (專業(yè)代碼)REFERENCES 專業(yè)(專業(yè)代碼)6.46.4查看約束的定義查看約束的定義 對于創(chuàng)建好的約束,根據(jù)實(shí)際需要可以查看其定義信息。SQL Server 2005提供了多種查看約束信息的方法,經(jīng)常使用的有利用對象資源管理器和系統(tǒng)存儲過程。 1利用對象資源管理器查看約束信息利用對象資源管理器查看約束信息 使用對象資源管理器查看約束信息的操作步驟如下:(1)在“對象資源管理器”窗格中,右擊要查看約束的表,在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計器”窗口。(2)右擊該表,在彈出的快捷菜單中分別選擇“關(guān)系”、“索引/鍵”、“CHECK約束”等命令查看約束信息,如圖6
30、-16所示。 圖6-16 查看約束信息菜單2利用存儲過程查看約束信息利用存儲過程查看約束信息存儲過程sp_helptext是用來查看約束的一個系統(tǒng)提供的存儲過程,可以通過查詢分析器來查看約束的名稱、創(chuàng)建者、類型和創(chuàng)建時間。其語法格式為:EXEC sp_help 約束名稱如果該約束有具體的定義和文本,那么可以用sp_helptext來查看。其語法格式為:EXEC sp_helptext 約束名稱【例6.9】使用系統(tǒng)存儲過程查看student數(shù)據(jù)庫中定義的入學(xué)時間(名稱為ck_rxsj)的約束信息和文本信息。代碼如下,結(jié)果如圖6-17所示。USE studentGOEXEC sp_help ck_
31、rxsjGOUSE studentGOEXEC sp_helptext ck_rxsjGO6.56.5刪除約束刪除約束 前面講了約束如何建立,約束在建立后可能根據(jù)實(shí)際情況需要刪除,可以使用對象資源管理器來刪除約束,也可以使用SQL語句來刪除約束。1用對象資源管理器來刪除表約束 使用對象資源管理器刪除約束非常方便,正如在建立約束時一樣,只需要在“表設(shè)計器”窗口中,將如圖6-2所示的“設(shè)置主鍵”前的復(fù)選框取消即可刪除主鍵約束,或刪除默認(rèn)值以刪除默認(rèn)約束;如圖6-8所示,單擊“刪除”按鈕刪除唯一約束;如圖6-12所示,單擊“刪除”按鈕刪除檢查約束;如圖6-14所示,單擊“刪除”按鈕刪除外鍵約束。2使
32、用DROP命令刪除表約束 利用SQL語句也可以方便地刪除一個或多個約束。其語法格式如下: ALTER TABLE table_name DROP CONSTRAINT constraint_name,n【例6.10】刪除“課程”表中的入學(xué)時間(ck_rxsj)約束。代碼如下:USE studentGOALTER TABLE 學(xué)生DROP CONSTRAINT ck_rxsjGO 6.66.6使用規(guī)則使用規(guī)則 規(guī)則類似于CHECK約束,是用來限制數(shù)據(jù)字段的輸入值的范圍,實(shí)現(xiàn)強(qiáng)制數(shù)據(jù)的域完整性。但規(guī)則不同于CHECK約束,在前面用到的CHECK約束可以針對一個列應(yīng)用多個CHECK約束,但一個列不能
33、應(yīng)用多個規(guī)則;規(guī)則需要被單獨(dú)創(chuàng)建,而CHECK約束在創(chuàng)建表的同時可以一起創(chuàng)建;規(guī)則比CHECK約束更復(fù)雜功能更強(qiáng)大;規(guī)則只需要創(chuàng)建一次,以后可以多次應(yīng)用,可以應(yīng)用于多個表多個列,還可以應(yīng)用到用戶定義的數(shù)據(jù)類型上。 使用規(guī)則包括規(guī)則的創(chuàng)建、綁定、解綁和刪除。可以在查詢分析器中用SQL語句完成。1創(chuàng)建規(guī)則 規(guī)則作為一種數(shù)據(jù)庫對象,在使用前必須被創(chuàng)建。創(chuàng)建規(guī)則的SQL命令是CREATE RULE。其語法格式如下: CREATE RULE rule_name AS condition_expression其中: rule_name是規(guī)則的名稱,命名必須符合SQL Server 2005的命名規(guī)則。 c
34、ondition_expression是條件表達(dá)式。2綁定規(guī)則要使創(chuàng)建好的規(guī)則作用到指定的列或表等,還必須將規(guī)則綁定到列或用戶定義的數(shù)據(jù)類型上才能夠起作用。在查詢分析器中,可以利用系統(tǒng)存儲過程將規(guī)則綁定到字段或用戶定義的數(shù)據(jù)類型上。其語法格式如下:EXECUTE sp_bindrule 規(guī)則名稱,表名.字段名|自定義數(shù)據(jù)類型名【例6.11】創(chuàng)建一個xb_rule規(guī)則,將它綁定到“學(xué)生”表的“性別”字段,保證輸入數(shù)據(jù)只能為“男”或“女”。代碼如下:USE studentGOCREATE RULE xb_ruleASxb in(男,女)GOEXEC sp_bindrule xb_rule,學(xué)生.性
35、別GO 3解綁規(guī)則如果字段已經(jīng)不再需要規(guī)則限制輸入了,那么必須把已經(jīng)綁定了的規(guī)則去掉,這就是解綁規(guī)則。在查詢分析器中,同樣用存儲過程來完成解綁操作。其語法格式如下:EXECUTE sp_unbindrule 表名.字段名|自定義數(shù)據(jù)類型名4刪除規(guī)則如果規(guī)則已經(jīng)沒有用了,那么可以將其刪除。在刪除前應(yīng)先對規(guī)則進(jìn)行解綁,當(dāng)規(guī)則已經(jīng)不再作用于任何表或字段等時,則可以用DROP RULE刪除一個或多個規(guī)則。其語法格式如下: DROP RULE 規(guī)則名稱,n【例6.12】從student數(shù)據(jù)庫中刪除xb_rule規(guī)則。代碼和結(jié)果如圖6-18所示。 圖6-18 刪除xb_rule規(guī)則6.76.7使用默認(rèn)使用
36、默認(rèn) 默認(rèn)(也稱默認(rèn)值、缺省值)是一種數(shù)據(jù)對象,它與DEFAULT(默認(rèn))約束的作用相同,也是當(dāng)向表中輸入數(shù)據(jù)的時候,沒有為列輸入值的時候,系統(tǒng)自動給該列賦一個“默認(rèn)值”。與DEFAULT約束不同的是默認(rèn)對象的定義獨(dú)立于表,類似規(guī)則,可以通過定義一次,多次應(yīng)用任意表的任意列,也可以應(yīng)用于用戶定義數(shù)據(jù)類型。 默認(rèn)對象的使用方法類似于規(guī)則,同樣包括創(chuàng)建、綁定、解綁和刪除。這些操作可以在查詢分析器中完成。 1創(chuàng)建默認(rèn)值在查詢分析器中,創(chuàng)建默認(rèn)對象的語法格式如下:CREATE DEFAULT default_nameAS default_description其中:default_name是默認(rèn)值名稱
37、,必須符合SQL Server 2005命名規(guī)則。default_description是常量表達(dá)式,可以包含常量、內(nèi)置函數(shù)或數(shù)學(xué)表達(dá)式。2綁定默認(rèn)值默認(rèn)值創(chuàng)建之后,必須將其綁定到表的字段或用戶自定義的數(shù)據(jù)類型上才能產(chǎn)生作用。在查詢分析器中使用系統(tǒng)存儲過程來完成綁定。其語法格式如下:EXECUTE sp_bindefault 默認(rèn)名稱,表名.字段名|自定義數(shù)據(jù)類型名【例6.13】創(chuàng)建一個df_xf默認(rèn),將其綁定到“課程注冊”表的“學(xué)分”字段,使默認(rèn)學(xué)分為4。代碼如下:USE studentGOCREATE DEFAULT df_xfAS 4GOEXEC sp_bindefault df_xf,
38、課程注冊.學(xué)分GO3解綁默認(rèn)值 類似規(guī)則,對于不需要再利用默認(rèn)的列,可以利用系統(tǒng)存儲過程對其解綁。其語法格式如下: EXECUTE sp_unbindefault 表名.字段名|自定義數(shù)據(jù)類型名4刪除默認(rèn)值當(dāng)默認(rèn)值不再有存在的必要時,可以將其刪除。在刪除前,必須先對默認(rèn)值解綁。在查詢分析器中使用DROP語句刪除默認(rèn)值。其語法格式如下:DROP DEFAULT default_name,n【例6.14】從student數(shù)據(jù)庫中將df_xf默認(rèn)值刪除。代碼如下:USE studentGOEXEC sp_unbindefault 課程注冊.學(xué)分GODROP DEFAULT df_xfGO 6.86.
39、8數(shù)據(jù)完整性強(qiáng)制選擇方法數(shù)據(jù)完整性強(qiáng)制選擇方法 SQL Server 2005提供了許多實(shí)現(xiàn)數(shù)據(jù)完整性的方法。除了本章介紹的約束、默認(rèn)和規(guī)則外,還有前面章節(jié)介紹的數(shù)據(jù)類型和后面需要學(xué)習(xí)的觸發(fā)器等。對于某一問題可能存在多種解決辦法,應(yīng)該根據(jù)系統(tǒng)的實(shí)際要求,從數(shù)據(jù)完整性方法實(shí)現(xiàn)的功能和開銷綜合考慮。 下面來簡單討論一下各種實(shí)現(xiàn)數(shù)據(jù)完整性的方法的功能和性能開銷。 觸發(fā)器功能強(qiáng)大,既可以維護(hù)基礎(chǔ)的數(shù)據(jù)完整性邏輯,又可以維護(hù)復(fù)雜的完整性邏輯,如多表的級聯(lián)操作,但是開銷較高;約束的功能比觸發(fā)器弱,但開銷低;默認(rèn)和規(guī)則功能更弱,開銷也更低;數(shù)據(jù)類型提供最低級別的數(shù)據(jù)完整性功能,開銷也是最低的。 在選擇完整性方案時,應(yīng)該遵循在完成同樣任務(wù)的條件下,選擇開銷低的方案解決。也就是說,能用約束完成的功能,就不用觸發(fā)器完成;能用數(shù)據(jù)類型完成的功能,就不用規(guī)則來完成。 6.9 應(yīng)應(yīng) 用用 舉舉 例例 1使用約束(1)用SQL語句創(chuàng)建cust_sample表,在其中創(chuàng)建四個字段
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年石家莊貨運(yùn)從業(yè)資格考試模擬考試題目及答案
- 茉莉花茶代理合同7篇
- 古箏采購合同范本
- 廠區(qū)道路修路合同范本
- 企業(yè)經(jīng)營貸款服務(wù)合同范本
- 上半年工作總結(jié)開頭
- 儒學(xué)大師邀請合同范本
- 動物防疫練習(xí)題庫與答案
- 病理學(xué)與病理生理學(xué)習(xí)題庫與參考答案
- 一年級法制教育教案
- 礦山機(jī)械傷害安全培訓(xùn)
- 2025貴州省黔東南州直屬事業(yè)單位招聘202人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年語文高考復(fù)習(xí)計劃解析
- 新生兒腸道病毒感染
- 2025年度專業(yè)酒店裝修承攬合同
- 2025年度5G基站建設(shè)勞務(wù)合同范本
- (完整版)班主任量化考核細(xì)則
- 2025年中國鐵路鄭州局集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025年上半年永春縣農(nóng)文旅發(fā)展集團(tuán)限公司公開招聘若干名工作人員易考易錯模擬試題(共500題)試卷后附參考答案
- 家庭康復(fù)服務(wù)的商業(yè)價值與發(fā)展趨勢
- 2025年危化企業(yè)安全教育培訓(xùn)計劃
評論
0/150
提交評論