第六章SQLServer2005數(shù)據(jù)完整性_第1頁
第六章SQLServer2005數(shù)據(jù)完整性_第2頁
第六章SQLServer2005數(shù)據(jù)完整性_第3頁
第六章SQLServer2005數(shù)據(jù)完整性_第4頁
第六章SQLServer2005數(shù)據(jù)完整性_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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ù)庫的基本操作,對(duì)于數(shù)據(jù)的添加、刪除、修改操作都可能對(duì)數(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ù)是從外界輸入的,由于種種原因,可能會(huì)輸

2、入無效或錯(cuò)誤的信息。保證輸入的數(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ù)完整性解釋為:存儲(chǔ)在數(shù)據(jù)庫中的所有數(shù)據(jù)值均正確。如果數(shù)據(jù)庫中存儲(chǔ)有不正確的數(shù)據(jù)值,則該數(shù)據(jù)庫稱為已喪失數(shù)據(jù)完整性。數(shù)據(jù)完整性(data integrity)是指數(shù)據(jù)的精確性(accuracy)和可靠性(reliability)。它是應(yīng)防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入/輸出造成無效操作或錯(cuò)誤信息而提出的。例如:在

3、student數(shù)據(jù)庫中,“學(xué)生”表中有“學(xué)號(hào)”、“姓名”、“性別”、“出生日期”、“入學(xué)時(shí)間”、“班級(jí)代碼”、“系部代碼”和“專業(yè)代碼”等8個(gè)字段,各個(gè)字段的數(shù)據(jù)類型都有規(guī)定。在這張表中,每個(gè)學(xué)生(也就是每條記錄)“學(xué)號(hào)”字段不能有重復(fù),也就是說每個(gè)學(xué)生都應(yīng)該有唯一的學(xué)號(hào),不能有兩個(gè)或多個(gè)學(xué)生的學(xué)號(hào)相同;“性別”字段中的數(shù)據(jù)只能為“男”或“女”,不能有其他數(shù)據(jù)填入;“出生日期”、“入學(xué)時(shí)間”、“班級(jí)代碼”、“系部代碼”和“專業(yè)代碼”字段必須有值,不能為空。這時(shí),由于數(shù)據(jù)的錯(cuò)誤或應(yīng)用程序的錯(cuò)誤就會(huì)導(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í)體。也可以這樣說,在表中不能存在完全相同的記錄,而且每條記錄都要有一個(gè)非空并且不重復(fù)的主鍵。主鍵的存在保證了任何記錄都是不重復(fù)的,可以區(qū)分,在對(duì)數(shù)據(jù)進(jìn)行操作時(shí)才可以和其他記錄區(qū)分開。例如,要對(duì)“學(xué)生”表中姓名為“張斌”的記錄進(jìn)行更改,針對(duì)更新這個(gè)操作只能針對(duì)“張斌”這個(gè)人(這條

5、記錄),那么選擇查詢或操作的時(shí)候就只能靠學(xué)號(hào)的唯一性來判斷,而其他字段的內(nèi)容可能與其他記錄產(chǎn)生重復(fù)。表中定義的PRIMARY KEY和IDENTITY約束就是實(shí)體完整性的體現(xiàn)。2域完整性域完整性域完整性(domain integrity)是指數(shù)據(jù)庫表中的字段必須滿足某種特定的數(shù)據(jù)類型或約束。其中,約束又包括取值范圍、精度等規(guī)定。例如,在“學(xué)生”表中,“學(xué)號(hào)”字段內(nèi)容只能填入規(guī)定長(zhǎng)度的學(xué)號(hào),而“性別”字段只能填入“男”或“女”,“出生日期”和“入學(xué)時(shí)間”只能填入日期類型數(shù)據(jù)。表中的CHECK、FOREIGN KEY 約束和DEFAULT、NOT NULL定義都屬于域完整性的范疇。3參照完整性參照

6、完整性參照完整性(referential integrity)是指兩個(gè)表的主鍵和外鍵的數(shù)據(jù)應(yīng)對(duì)應(yīng)一致。它確保了有主鍵的表中對(duì)應(yīng)其他表的外鍵的存在,即保證了表之間數(shù)據(jù)的一致性,防止了數(shù)據(jù)丟失或無意義的數(shù)據(jù)在數(shù)據(jù)庫中擴(kuò)散。參照完整性是建立在外鍵和主鍵之間或外鍵和唯一性關(guān)鍵字之間的關(guān)系上的。例如,在“學(xué)生”表中的“系部代碼”的值必須是在“系部”表中存在的值。在SQL Server 2005中,參照完整性作用表現(xiàn)在如下三個(gè)方面:(1)禁止在從表中插入包含主表中不存在的關(guān)鍵字的數(shù)據(jù)行。(2)禁止會(huì)導(dǎo)致從表中相應(yīng)值孤立的主表中的外鍵值改變。(3)禁止刪除在從表中有對(duì)應(yīng)記錄的主表記錄。4用戶定義的完整性用戶

7、定義的完整性不同的關(guān)系數(shù)據(jù)庫系統(tǒng)根據(jù)其應(yīng)用環(huán)境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性(user-defined integrity)即是針對(duì)某個(gè)特定關(guān)系數(shù)據(jù)庫的約束條件,它反映了某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語義要求。SQL Server 2005提供了定義和檢驗(yàn)這類完整性的機(jī)制,以便用統(tǒng)一的系統(tǒng)方法來處理它們,而不是用應(yīng)用程序來承擔(dān)這一功能。其他的完整性類型都支持用戶定義的完整性。6.26.2約束的類型約束的類型 微軟文檔中將約束解釋為:約束使您得以定義Microsoft SQL Server 2005自動(dòng)強(qiáng)制數(shù)據(jù)庫完整性的方式。約束定義關(guān)于字段中允許值的規(guī)則,是強(qiáng)制完整

8、性的標(biāo)準(zhǔn)機(jī)制。使用約束優(yōu)先于使用觸發(fā)器、規(guī)則和默認(rèn)值。查詢優(yōu)化器也使用約束定義生成高性能的查詢執(zhí)行計(jì)劃。約束就是一種強(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é)號(hào)”字段值不能為空,在插入記錄的時(shí)候這個(gè)字段里必須有值存在。2CHECK約束對(duì)可以放入列中的值進(jìn)行限制,以強(qiáng)約束對(duì)可以放入列中的值進(jìn)行限制,以強(qiáng)制執(zhí)行域的完整性制執(zhí)行域的完整性CHECK約束指定應(yīng)用于列中輸入的所有值的布爾(取值為TRUE或FALSE)搜索條件,拒絕所有不取值為TRUE的值。可以為每列指定多個(gè)CHECK約束。 3UNIQUE約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一性約束在列集內(nèi)強(qiáng)制執(zhí)行值的唯一性對(duì)于UNIQUE約束中的列,表中不允許有兩行包含相同的非空值。主鍵也強(qiáng)制執(zhí)行唯一性,但主鍵不允許空值。主鍵約束優(yōu)先于唯一索引。例如,在“系部”表中可以將“系部代碼”作為主鍵,用來保證

10、記錄的唯一性 。4PRIMARY KEY約束標(biāo)識(shí)列或列集,這些列或列約束標(biāo)識(shí)列或列集,這些列或列集的值唯一標(biāo)識(shí)表中的行集的值唯一標(biāo)識(shí)表中的行在一個(gè)表中,不能有兩行包含相同的主鍵值。不能在主鍵內(nèi)的任何列中輸入空值。在數(shù)據(jù)庫中“空”是特殊值,代表不同于空白和 0 值的未知值。建議使用一個(gè)小的整數(shù)列作為主鍵。每個(gè)表都應(yīng)有一個(gè)主鍵。例如,要在“學(xué)生”表中區(qū)分每一個(gè)學(xué)生,區(qū)分的唯一標(biāo)志不是姓名,也不是出生日期,更不能是班級(jí),而是每個(gè)學(xué)生唯一對(duì)應(yīng)的“學(xué)號(hào)”值,“學(xué)號(hào)”在表中就應(yīng)該設(shè)為主鍵。5FOREIGN KEY約束標(biāo)識(shí)表之間的關(guān)系約束標(biāo)識(shí)表之間的關(guān)系外鍵是在一個(gè)數(shù)據(jù)表中的一個(gè)列或多個(gè)列,它不應(yīng)該是該表的

11、主鍵,但是它可以是其他表的主鍵。一個(gè)表的外鍵指向另一個(gè)表的候選鍵。當(dāng)外鍵值沒有候選鍵時(shí),外鍵可防止操作保留帶外鍵值的行。例如,在“學(xué)生”表中,“系部代碼”字段的值不是該表的主鍵,而它卻是“系部”表的主鍵。利用外鍵可以維護(hù)數(shù)據(jù)表之間的關(guān)系。 6 6DEFAULTDEFAULT約束為列填入默認(rèn)值約束為列填入默認(rèn)值利用默認(rèn)值可以為未填入值的列強(qiáng)制填入一個(gè)默認(rèn)情況下的值。例如,對(duì)“學(xué)生”表中的性別列,如未填入任何值則可把性別默認(rèn)填入“男”。約束可以是列約束或表約束:約束被指定為列定義的一部分,并且僅適用于那個(gè)列。約束的聲明與列的定義無關(guān),可以適用于表中一個(gè)以上的列。 當(dāng)一個(gè)約束中必須包含一個(gè)以上的列時(shí)

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用對(duì)象資源管理器創(chuàng)建主鍵約束用對(duì)象資源管理器創(chuàng)建主鍵約束下面以下面以“學(xué)生學(xué)生”表為例,介紹使用對(duì)象資源管理器創(chuàng)表為例,介紹使用對(duì)象資源管理器創(chuàng)建主鍵約束的操作步驟:建主鍵約束的操作步驟:(1 1)在)在“對(duì)象資源管理器對(duì)象資源管理器”窗格中依次展開窗格中依次展開“服

13、務(wù)服務(wù)器器”、“數(shù)據(jù)庫數(shù)據(jù)庫”、“student”student”、“表表”結(jié)點(diǎn)。結(jié)點(diǎn)。找到需要修改的表名(這里為找到需要修改的表名(這里為“學(xué)生學(xué)生”表),右表),右擊該表,在彈出的快捷菜單中選擇擊該表,在彈出的快捷菜單中選擇“修改修改”命令,命令,如圖如圖6-16-1所示。所示。(2 2)在)在“表設(shè)計(jì)器表設(shè)計(jì)器”窗口中,選擇需要設(shè)為主鍵的窗口中,選擇需要設(shè)為主鍵的字段,如果需要選擇多個(gè)字段,可按住【字段,如果需要選擇多個(gè)字段,可按住【CtrlCtrl】鍵再選擇其他列鍵再選擇其他列。 (3)選擇好后,右擊該字段,從彈出的快捷菜單中選擇“設(shè)置主鍵”命令,如圖6-2所示,或單擊工具欄中的“設(shè)置

14、主鍵”按鈕 。 圖6-2 選擇“設(shè)置主鍵”命令 圖6-1 選擇“修改”命令 執(zhí)行完命令后,在該列前面會(huì)出現(xiàn)鑰匙圖樣,說明主鍵設(shè)置成功,如圖6-3所示。 圖6-3 主鍵設(shè)置成功(5)設(shè)置完成主鍵后,關(guān)閉“表設(shè)計(jì)器”窗口。注意:因?yàn)橹麈I是唯一的,所以表中的列原來有數(shù)據(jù),并且數(shù)據(jù)有重復(fù),那么在設(shè)置主鍵時(shí)會(huì)出現(xiàn)錯(cuò)誤。如圖6-4所示,學(xué)號(hào)第一條和第四條記錄相同。圖6-4 數(shù)據(jù)重復(fù)在設(shè)置主鍵的時(shí)候會(huì)出現(xiàn)如圖6-5所示的錯(cuò)誤提示。圖6-5 錯(cuò)誤提示 2. 2. 使用使用SQLSQL語句創(chuàng)建主鍵約束語句創(chuàng)建主鍵約束使用SQL語句創(chuàng)建主鍵,可以用CREATE TABLE命令在創(chuàng)建表的同時(shí)完成,也可以用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ù)庫中,建立一個(gè)“教材”表,將“教材代碼”設(shè)置為主鍵。“教材”表結(jié)構(gòu)如表6-1所示。表6-1 “教材”表結(jié)構(gòu)字 段 名 稱

16、 數(shù) 據(jù) 類 型 字 段 長(zhǎng) 度 是 否 為 空 教材代碼 char 9否 教材名稱 varchar 30是 書號(hào) char 12是 出版社 varchar 30是 版本 char 10是 單價(jià) tinyint 是 代碼如下:USE studentGOCREATE TABLE 教材(教材代碼 char(9) CONSTRAINT pk_jcdm PRIMARY KEY, 教材名稱 varchar(30), 書號(hào) char(12), 出版社 varchar(30), 版本 char(10), 單價(jià) tinyint)GO【例6.2】如果在創(chuàng)建“教材”表時(shí)沒有指定主鍵,可在創(chuàng)建好后的“教材”表中,將

17、“教材代碼”設(shè)置為主鍵。代碼如下:USE studentGOALTER TABLE 教材ADD CONSTRAINT pk_jcdmPRIMARY KEY CLUSTERED (教材代碼)GO在對(duì)象資源管理器中可以看到如圖6-6所示的主鍵創(chuàng)建好的效果。圖6-6 主鍵已創(chuàng)建好 6.3.2創(chuàng)建唯一約束創(chuàng)建唯一約束 在一張數(shù)據(jù)表中,有時(shí)除主鍵需要具有唯一性外,在一張數(shù)據(jù)表中,有時(shí)除主鍵需要具有唯一性外,還有其他列也需要具有唯一性。例如,在還有其他列也需要具有唯一性。例如,在“系系部部”表中,主鍵為表中,主鍵為“系部代碼系部代碼”,但是另外一,但是另外一個(gè)字段個(gè)字段“系部名稱系部名稱”雖不是主鍵,也需

18、保證它雖不是主鍵,也需保證它的唯一性,這時(shí)就需要?jiǎng)?chuàng)建表中的唯一約束。的唯一性,這時(shí)就需要?jiǎng)?chuàng)建表中的唯一約束。1 1使用對(duì)象資源管理器創(chuàng)建唯一約束使用對(duì)象資源管理器創(chuàng)建唯一約束下面以下面以“系部系部”表為例,為表為例,為“系部名稱系部名稱”字段創(chuàng)建字段創(chuàng)建唯一約束。操作步驟如下:唯一約束。操作步驟如下:(1 1)在)在“對(duì)象資源管理器對(duì)象資源管理器”窗格中,右擊需要設(shè)窗格中,右擊需要設(shè)置唯一約束的表(本例為置唯一約束的表(本例為“系部系部”表),在彈表),在彈出的快捷菜單中選擇出的快捷菜單中選擇“修改修改”命令,打開命令,打開“表表設(shè)計(jì)器設(shè)計(jì)器”窗口。窗口。(2)在“表設(shè)計(jì)器”窗口中,右擊需要設(shè)

19、置為唯一約束的字段(本例為“系部名稱”字段),在彈出的快捷菜單中選擇“索引/鍵”命令,如圖6-7所示,也可以直接單擊工具欄中的“管理索引和鍵”按鈕,打開“索引/鍵”對(duì)話框,如圖6-8所示。圖6-7 選擇“索引/鍵”命令圖6-8 “索引/鍵”對(duì)話框(3)在打開的“索引/鍵”對(duì)話框中,單擊“添加”按鈕,結(jié)果如圖6-9所示。圖6-9 單擊“添加”按鈕創(chuàng)建唯一約束(4)設(shè)置好相關(guān)選項(xiàng)后,單擊“關(guān)閉”按鈕,完成唯一約束的創(chuàng)建。這時(shí),不只是該表的主鍵必須為唯一,并且被設(shè)置為唯一約束的字段同樣也必須為唯一。2使用SQL語句創(chuàng)建唯一約束 為已經(jīng)存在的表創(chuàng)建唯一約束,其語法格式如下:ALTER TABLE ta

20、ble_nameADDCONSTRAINT constraint_nameUNIQUE CLUSTERED|NONCLUSTERED(column,n)其中: table_name為需要?jiǎng)?chuàng)建唯一約束的表名稱; constraint_name為唯一約束的名稱; column是表中需要?jiǎng)?chuàng)建唯一約束的字段名稱 【例6.3】在student數(shù)據(jù)庫的“教材”表中,為“書號(hào)”字段創(chuàng)建唯一約束。代碼如下:USE studentGOALTER TABLE 教材ADD CONSTRAINT uk_shUNIQUE NONCLUSTERED (書號(hào))GO執(zhí)行完上述SQL語句后,可以打開“索引/鍵”對(duì)話框重新查看該

21、表的唯一約束,如圖6-10所示。圖6-10 表的唯一約束可以看到,剛才的SQL語句起了作用,將書號(hào)字段創(chuàng)建了一個(gè)名稱為uk_sh的唯一約束。6.3.36.3.3創(chuàng)建檢查約束創(chuàng)建檢查約束 檢查約束對(duì)輸入的數(shù)據(jù)的值做檢查,可以限定數(shù)據(jù)輸入,從而維護(hù)數(shù)據(jù)的域完整性。例如,對(duì)“課程”表中“學(xué)分”字段的內(nèi)容,只允許為17分,不允許小于1分的學(xué)分和大于7分的學(xué)分出現(xiàn)。可以利用對(duì)象資源管理器或SQL語句來創(chuàng)建檢查約束。1使用對(duì)象資源管理器創(chuàng)建檢查約束 下面以“課程”表為例,介紹如何對(duì)“學(xué)分”字段內(nèi)容創(chuàng)建檢查約束。操作步驟如下:(1)在“對(duì)象資源管理器”窗格中,右擊需要設(shè)置唯一約束的表(本例為“課程”表),在

22、彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)在“表設(shè)計(jì)器”窗口中右擊需要?jiǎng)?chuàng)建檢查約束的字段(本例為“學(xué)分”字段),在彈出的快捷菜單中選擇“CHECK約束”命令,如圖6-11所示,打開“CHECK約束”對(duì)話框。 圖6-11 選擇“CHECK約束”命令 (3)在“CHECK約束”對(duì)話框中,單擊“添加”按鈕,然后在“(名稱)”文本框中輸入檢查約束名稱,在約束“表達(dá)式”文本框中輸入約束條件,這里輸入“(學(xué)分=1 AND 學(xué)分01/01/1978 AND 入學(xué)時(shí)間GETDATE()GO 6.3.46.3.4創(chuàng)建默認(rèn)約束創(chuàng)建默認(rèn)約束 在用戶輸入某些數(shù)據(jù)時(shí),希望一些數(shù)據(jù)在沒有特例的情況下被

23、自動(dòng)輸入,例如,學(xué)生的注冊(cè)日期應(yīng)該是數(shù)據(jù)錄入的當(dāng)天日期;學(xué)生的修學(xué)年限是固定的值;學(xué)生性別默認(rèn)是“男”等情況,這個(gè)時(shí)候需要對(duì)數(shù)據(jù)表創(chuàng)建默認(rèn)約束。下面分別用例子說明如何在對(duì)象資源管理器中和利用SQL語句創(chuàng)建默認(rèn)約束。1使用對(duì)象資源管理器創(chuàng)建默認(rèn)約束下面以“學(xué)生”表為例,在“性別”字段創(chuàng)建默認(rèn)為“男”的默認(rèn)約束。操作步驟如下:(1)在“對(duì)象資源管理器”窗格中,右擊需要?jiǎng)?chuàng)建默認(rèn)約束的表(這里為“學(xué)生”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)選擇需要?jiǎng)?chuàng)建默認(rèn)約束的字段(這里為“性別”字段),然后在下方的“列屬性”選項(xiàng)卡中的“默認(rèn)值或綁定”文本框中輸入默認(rèn)值,本例為選擇“性

24、別”字段,在默認(rèn)值中輸入“男”,如圖6-13所示。 圖6-13 輸入默認(rèn)值注意注意:?jiǎn)我?hào)不需要輸入,在表保存后,在單引號(hào)外還會(huì)自動(dòng)生成一對(duì)小括號(hào)。(3)關(guān)閉“表設(shè)計(jì)器”窗口。 2. 2. 使用使用SQLSQL語句創(chuàng)建默認(rèn)約束語句創(chuàng)建默認(rèn)約束在創(chuàng)建表的同時(shí),可以對(duì)創(chuàng)建的表中的字段創(chuàng)建默認(rèn)約束,如例6.6。【例6.6】在student數(shù)據(jù)庫中新建“學(xué)生注冊(cè)”表,并將“注冊(cè)時(shí)間”設(shè)置為當(dāng)前日期。代碼如下:USE studentGOCREATE TABLE 學(xué)生注冊(cè)(注冊(cè)編碼 int PRIMARY KEY, 學(xué)號(hào) char(12), 注冊(cè)時(shí)間 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是需要?jiǎng)?chuàng)建默認(rèn)約束的表名稱。 constraint_name是默認(rèn)約束名稱。 constraint_expression是默認(rèn)值。 FOR column_name是需要?jiǎng)?chuàng)建默認(rèn)約束的字段名稱。【例6.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ù)表與表之間對(duì)應(yīng)唯一關(guān)系的一種方法。可以利用對(duì)象資源管理器或SQL語句來創(chuàng)建外鍵約束。1使用對(duì)象資源管理器創(chuàng)建外鍵約束 下面以“教師”表為例,為“系部代碼”創(chuàng)建外鍵約束。操作步驟如下: (1)在“對(duì)象資源管理器”窗格中,右擊需要?jiǎng)?chuàng)建外鍵約束的表(這里為“教師”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。 (2)選擇需要?jiǎng)?chuàng)建外鍵約束的字段(這里為“系部代碼”字段),單擊

27、工具欄中的“關(guān)系”按鈕,或右擊該字段,在彈出的快捷菜單中選擇“關(guān)系”命令,打開“外鍵關(guān)系”對(duì)話框,如圖6-14所示。 圖6-14 “外鍵關(guān)系”對(duì)話框(3)在“外鍵關(guān)系”對(duì)話框中,單擊“添加”按鈕,然后單擊“表和列規(guī)范”的按鈕,打開“表和列”對(duì)話框。在“主鍵表”下拉列表中選擇“系部”表,在“外鍵表”的下拉列表框中選擇“教師”表,分別在“主鍵表”和“外鍵表”的下面選擇“系部代碼”字段,如圖6-15所示。 圖6-15 “表和列”對(duì)話框(4)單擊“確定”按鈕,然后在“外鍵關(guān)系”對(duì)話框中進(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是需要?jiǎng)?chuàng)建外鍵約束的表名稱。 constraint_name是外鍵約束名稱。 【例6.8】在student數(shù)據(jù)庫中的“班級(jí)”表中,為“專業(yè)代碼”字段創(chuàng)建一個(gè)外鍵約束,從而保證輸入有效的專業(yè)代碼。代碼如下:USE studentGOALTER TABLE 班級(jí)ADD CONSTRAINT fk_zydmFORE

29、IGN KEY (專業(yè)代碼)REFERENCES 專業(yè)(專業(yè)代碼)6.46.4查看約束的定義查看約束的定義 對(duì)于創(chuàng)建好的約束,根據(jù)實(shí)際需要可以查看其定義信息。SQL Server 2005提供了多種查看約束信息的方法,經(jīng)常使用的有利用對(duì)象資源管理器和系統(tǒng)存儲(chǔ)過程。 1利用對(duì)象資源管理器查看約束信息利用對(duì)象資源管理器查看約束信息 使用對(duì)象資源管理器查看約束信息的操作步驟如下:(1)在“對(duì)象資源管理器”窗格中,右擊要查看約束的表,在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)右擊該表,在彈出的快捷菜單中分別選擇“關(guān)系”、“索引/鍵”、“CHECK約束”等命令查看約束信息,如圖6-

30、16所示。 圖6-16 查看約束信息菜單2利用存儲(chǔ)過程查看約束信息利用存儲(chǔ)過程查看約束信息存儲(chǔ)過程sp_helptext是用來查看約束的一個(gè)系統(tǒng)提供的存儲(chǔ)過程,可以通過查詢分析器來查看約束的名稱、創(chuàng)建者、類型和創(chuàng)建時(shí)間。其語法格式為:EXEC sp_help 約束名稱如果該約束有具體的定義和文本,那么可以用sp_helptext來查看。其語法格式為:EXEC sp_helptext 約束名稱【例6.9】使用系統(tǒng)存儲(chǔ)過程查看student數(shù)據(jù)庫中定義的入學(xué)時(shí)間(名稱為ck_rxsj)的約束信息和文本信息。代碼如下,結(jié)果如圖6-17所示。USE studentGOEXEC sp_help ck_r

31、xsjGOUSE studentGOEXEC sp_helptext ck_rxsjGO6.56.5刪除約束刪除約束 前面講了約束如何建立,約束在建立后可能根據(jù)實(shí)際情況需要?jiǎng)h除,可以使用對(duì)象資源管理器來刪除約束,也可以使用SQL語句來刪除約束。1用對(duì)象資源管理器來刪除表約束 使用對(duì)象資源管理器刪除約束非常方便,正如在建立約束時(shí)一樣,只需要在“表設(shè)計(jì)器”窗口中,將如圖6-2所示的“設(shè)置主鍵”前的復(fù)選框取消即可刪除主鍵約束,或刪除默認(rèn)值以刪除默認(rèn)約束;如圖6-8所示,單擊“刪除”按鈕刪除唯一約束;如圖6-12所示,單擊“刪除”按鈕刪除檢查約束;如圖6-14所示,單擊“刪除”按鈕刪除外鍵約束。2使用

32、DROP命令刪除表約束 利用SQL語句也可以方便地刪除一個(gè)或多個(gè)約束。其語法格式如下: ALTER TABLE table_name DROP CONSTRAINT constraint_name,n【例6.10】刪除“課程”表中的入學(xué)時(shí)間(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約束可以針對(duì)一個(gè)列應(yīng)用多個(gè)CHECK約束,但一個(gè)列不能應(yīng)

33、用多個(gè)規(guī)則;規(guī)則需要被單獨(dú)創(chuàng)建,而CHECK約束在創(chuàng)建表的同時(shí)可以一起創(chuàng)建;規(guī)則比CHECK約束更復(fù)雜功能更強(qiáng)大;規(guī)則只需要?jiǎng)?chuàng)建一次,以后可以多次應(yīng)用,可以應(yīng)用于多個(gè)表多個(gè)列,還可以應(yīng)用到用戶定義的數(shù)據(jù)類型上。 使用規(guī)則包括規(guī)則的創(chuàng)建、綁定、解綁和刪除。可以在查詢分析器中用SQL語句完成。1創(chuàng)建規(guī)則 規(guī)則作為一種數(shù)據(jù)庫對(duì)象,在使用前必須被創(chuàng)建。創(chuàng)建規(guī)則的SQL命令是CREATE RULE。其語法格式如下: CREATE RULE rule_name AS condition_expression其中: rule_name是規(guī)則的名稱,命名必須符合SQL Server 2005的命名規(guī)則。 co

34、ndition_expression是條件表達(dá)式。2綁定規(guī)則要使創(chuàng)建好的規(guī)則作用到指定的列或表等,還必須將規(guī)則綁定到列或用戶定義的數(shù)據(jù)類型上才能夠起作用。在查詢分析器中,可以利用系統(tǒng)存儲(chǔ)過程將規(guī)則綁定到字段或用戶定義的數(shù)據(jù)類型上。其語法格式如下:EXECUTE sp_bindrule 規(guī)則名稱,表名.字段名|自定義數(shù)據(jù)類型名【例6.11】創(chuàng)建一個(gè)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ī)則。在查詢分析器中,同樣用存儲(chǔ)過程來完成解綁操作。其語法格式如下:EXECUTE sp_unbindrule 表名.字段名|自定義數(shù)據(jù)類型名4刪除規(guī)則如果規(guī)則已經(jīng)沒有用了,那么可以將其刪除。在刪除前應(yīng)先對(duì)規(guī)則進(jìn)行解綁,當(dāng)規(guī)則已經(jīng)不再作用于任何表或字段等時(shí),則可以用DROP RULE刪除一個(gè)或多個(gè)規(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ù)對(duì)象,它與DEFAULT(默認(rèn))約束的作用相同,也是當(dāng)向表中輸入數(shù)據(jù)的時(shí)候,沒有為列輸入值的時(shí)候,系統(tǒng)自動(dòng)給該列賦一個(gè)“默認(rèn)值”。與DEFAULT約束不同的是默認(rèn)對(duì)象的定義獨(dú)立于表,類似規(guī)則,可以通過定義一次,多次應(yīng)用任意表的任意列,也可以應(yīng)用于用戶定義數(shù)據(jù)類型。 默認(rèn)對(duì)象的使用方法類似于規(guī)則,同樣包括創(chuàng)建、綁定、解綁和刪除。這些操作可以在查詢分析器中完成。 1創(chuàng)建默認(rèn)值在查詢分析器中,創(chuàng)建默認(rèn)對(duì)象的語法格式如下: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)存儲(chǔ)過程來完成綁定。其語法格式如下:EXECUTE sp_bindefault 默認(rèn)名稱,表名.字段名|自定義數(shù)據(jù)類型名【例6.13】創(chuàng)建一個(gè)df_xf默認(rèn),將其綁定到“課程注冊(cè)”表的“學(xué)分”字段,使默認(rèn)學(xué)分為4。代碼如下:USE studentGOCREATE DEFAULT df_xfAS 4GOEXEC sp_bindefault df_xf,課

38、程注冊(cè).學(xué)分GO3解綁默認(rèn)值 類似規(guī)則,對(duì)于不需要再利用默認(rèn)的列,可以利用系統(tǒng)存儲(chǔ)過程對(duì)其解綁。其語法格式如下: EXECUTE sp_unbindefault 表名.字段名|自定義數(shù)據(jù)類型名4刪除默認(rèn)值當(dāng)默認(rèn)值不再有存在的必要時(shí),可以將其刪除。在刪除前,必須先對(duì)默認(rèn)值解綁。在查詢分析器中使用DROP語句刪除默認(rèn)值。其語法格式如下:DROP DEFAULT default_name,n【例6.14】從student數(shù)據(jù)庫中將df_xf默認(rèn)值刪除。代碼如下:USE studentGOEXEC sp_unbindefault 課程注冊(cè).學(xué)分GODROP DEFAULT df_xfGO 6.86.8

39、數(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ā)器等。對(duì)于某一問題可能存在多種解決辦法,應(yīng)該根據(jù)系統(tǒng)的實(shí)際要求,從數(shù)據(jù)完整性方法實(shí)現(xiàn)的功能和開銷綜合考慮。 下面來簡(jiǎn)單討論一下各種實(shí)現(xiàn)數(shù)據(jù)完整性的方法的功能和性能開銷。 觸發(fā)器功能強(qiáng)大,既可以維護(hù)基礎(chǔ)的數(shù)據(jù)完整性邏輯,又可以維護(hù)復(fù)雜的完整性邏輯,如多表的級(jí)聯(lián)操作,但是開銷較高;約束的功能比觸發(fā)器弱,但開銷低;默認(rèn)和規(guī)則功能更弱,開銷也更低;數(shù)據(jù)類型提供最低級(jí)別的數(shù)據(jù)完整性功能,開銷也是最低的。 在選擇完整性方案時(shí),應(yīng)該遵循在完成同樣任務(wù)的條件下,選擇開銷低的方案解決。也就是說,能用約束完成的功能,就不用觸發(fā)器完成;能用數(shù)據(jù)類型完成的功能,就不用規(guī)則來完成。 6.9 應(yīng)應(yīng) 用用 舉舉 例例 1使用約束(1)用SQL語句創(chuàng)建cust_sample表,在其中創(chuàng)建四個(gè)字段

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論