第7章 索引和完整性_第1頁
第7章 索引和完整性_第2頁
第7章 索引和完整性_第3頁
第7章 索引和完整性_第4頁
第7章 索引和完整性_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第7章章 索引和完整性索引和完整性7.1 索索 引引7.2 數(shù)據(jù)完整性數(shù)據(jù)完整性7.1 索索 引引在數(shù)據(jù)庫系統(tǒng)中建立索引主要有以下作用:(1)快速存取數(shù)據(jù)。(2)保證數(shù)據(jù)記錄的唯一性。(3)實(shí)現(xiàn)表與表之間的參照完整性。(4)在使用ORDER BY、GROUP BY子句進(jìn)行數(shù)據(jù)檢索時(shí),利用索引可以減少排序和分組的時(shí)間。7.1.1 索引的分類索引的分類1聚集索引聚集索引聚集索引使得數(shù)據(jù)表物理順序與索引順序一致。不論聚集索引里有表的哪個(gè)(或哪些)字段,這些字段都會按順序保存在表中。由于存在這種排序,所以每個(gè)表只會有一個(gè)聚集索引。2非聚集索引非聚集索引在非聚集索引內(nèi),從索引行指向數(shù)據(jù)行的指針稱為行定

2、位器。行定位器的結(jié)構(gòu)取決于數(shù)據(jù)頁的存儲方式是堆集還是聚集。對于堆集,行定位器是指向行的指針。對于有聚集索引的表,行定位器是聚集索引鍵。如果一個(gè)表只有非聚集索引,則它的數(shù)據(jù)行將按無序的堆集方式存儲。一個(gè)表中可有一個(gè)或多個(gè)非聚集索引。當(dāng)在一個(gè)表中既要?jiǎng)?chuàng)建聚集索引,又要?jiǎng)?chuàng)建非聚集索引時(shí),應(yīng)先創(chuàng)建聚集索引,然后再創(chuàng)建非聚集索引,因?yàn)閯?chuàng)建聚集索引時(shí)將改變數(shù)據(jù)記錄的物理存放順序。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX為了提高查詢和更新速度,可以考慮對三個(gè)表建立如下索引:(1)對于xsb表,按學(xué)號建立主鍵索引(PRIMARY KEY約束),組織方式為聚集索引。(2)對于kcb表,按課程

3、號建立主鍵索引,組織方式為聚集索引。(3)對于kcb表,按課程名建立唯一索引(UNIQUE約束),組織方式為非聚集索引。(4)對于cjb表,按學(xué)號+課程號建立唯一索引,組織方式為聚集索引。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX1界面(對象資源管理器)方式創(chuàng)建索引界面(對象資源管理器)方式創(chuàng)建索引 【例7.1】 在pxscj數(shù)據(jù)庫xsb表中按“出生時(shí)間”列建立索引。(1)在“對象資源管理器”中選擇pxscj數(shù)據(jù)庫“dbo.xsb”表展開,右擊其中的“索引”項(xiàng),在彈出的快捷菜單上選擇“新建索引”菜單項(xiàng),并且其后選擇索引類型,如圖7.1所示。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:

4、CREATE INDEX(2)新建索引。)新建索引。在打開的“新建索引”中,單擊“添加”按鈕,系統(tǒng)打開一個(gè)xsb表字段選擇對話框,勾選需要索引的列(例如“出生時(shí)間” ),單擊“確定”按鈕,在“索引鍵列”中就會顯示該列,如圖7.2所示。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX2界面(表設(shè)計(jì)器)方式創(chuàng)建索引界面(表設(shè)計(jì)器)方式創(chuàng)建索引【例7.2】 在pxscj數(shù)據(jù)庫的xsb表中按“姓名”列建立非唯一索引。(1)選擇pxscj數(shù)據(jù)庫中的“dbo.xsb”表,在彈出的快捷菜單中選擇“設(shè)計(jì)”菜單項(xiàng),打開“表設(shè)計(jì)器”窗口。在“表設(shè)計(jì)器”窗口中,選擇任何列,右擊鼠標(biāo),在彈出的快捷菜單中選

5、擇“索引/鍵”菜單項(xiàng)。系統(tǒng)顯示已經(jīng)創(chuàng)建的索引“PK_xsb”(學(xué)號作為主鍵的聚合索引)和PK_cssj(出生時(shí)間非聚合索引)及其屬性。(2)單擊“添加”按鈕,系統(tǒng)創(chuàng)建一個(gè)默認(rèn)的索引,索引名為“IX_xsb”,用戶可在右邊的“標(biāo)識”屬性區(qū)域進(jìn)行修改。名稱:修改為“IX_xsb_xm”。列:在該欄后面單擊 按鈕,修改要?jiǎng)?chuàng)建索引的列為“姓名”,默認(rèn)“升序”。是唯一的:保持“否”, 表示索引不是唯一索引。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX由于xsb表中已經(jīng)存在聚集索引,所以這里的這個(gè)選項(xiàng)不可修改,如圖7.3所示。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX3利

6、用利用SQL命令建立索引命令建立索引語法格式:CREATE UNIQUE CLUSTERED | NONCLUSTERED INDEX 索引名 ON 表或視圖名 ( 列 ASC | DESC )WHERE子句其中,其中,(1)UNIQUE:表示為表或視圖創(chuàng)建唯一索引(即不允許存在索引值相同的兩行)。例如,對于xsb表,根據(jù)學(xué)號創(chuàng)建唯一索引,即不允許有兩個(gè)相同的學(xué)號出現(xiàn)。(2)CLUSTERED | NONCLUSTERED:CLUSTERED表示創(chuàng)建聚集索引,NONCLUSTERED表示創(chuàng)建非聚集索引。(3)索引名:索引名在表或視圖中必須唯一,但在數(shù)據(jù)庫中不必唯一;“表或視圖名”用于指定包含索

7、引字段的表名或視圖名,指定表名、視圖名時(shí)可包含數(shù)據(jù)庫和所屬架構(gòu)。(4)列:指定建立索引的字段,可以為索引指定多個(gè)字段。指定索引字段時(shí),注意表或視圖索引字段的類型不能為ntext、text或image。(5)WHERE子句:通過指定索引中要包含哪些行來創(chuàng)建篩選索引。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX【例7.3】 在pxscj數(shù)據(jù)庫中為kcb表的“課程名”列創(chuàng)建索引,為“課程號”列創(chuàng)建唯一聚集索引。USE pxscjGO CREATE INDEX kc_name ON kcb(課程名)CREATE UNIQUE CLUSTERED INDEX kc_id ON kcb (

8、課程號)【例7.4】 根據(jù)cjb表的“學(xué)號”列和“課程號”列創(chuàng)建復(fù)合索引。CREATE INDEX cjb_ind ON cjb(學(xué)號, 課程號) WITH(DROP_EXISTING= ON)其中,DROP_EXISTING指定刪除已存在的同名聚集索引或非聚集索引。例如,根據(jù)xsb表中“學(xué)號”列創(chuàng)建唯一聚集索引。如果輸入了重復(fù)的鍵值,將忽略該INSERT或UPDATE語句。CREATE UNIQUE CLUSTERED INDEX xs_ind ON xsb(學(xué)號) WITH IGNORE_DUP_KEY其中,IGNORE_DUP_KEY指定對索引列插入操作時(shí)出現(xiàn)重復(fù)鍵值的錯(cuò)誤響應(yīng)。7.1.

9、2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX4在計(jì)算列和視圖上創(chuàng)建索引在計(jì)算列和視圖上創(chuàng)建索引(1)在計(jì)算列上創(chuàng)建索引。)在計(jì)算列上創(chuàng)建索引。對于UNIQUE或PRIMARY KEY索引,只要滿足索引條件,就可以包含計(jì)算列,但計(jì)算列必須具有確定性,必須精確。若計(jì)算列中帶有函數(shù),則要求該函數(shù)有相同的參數(shù)輸入,輸出的結(jié)果也一定相同。例如,pxscj數(shù)據(jù)庫的xsb表中的“年齡”列是計(jì)算列,可以創(chuàng)建索引。(2)在視圖上創(chuàng)建索引。)在視圖上創(chuàng)建索引。可以在視圖上定義索引。索引視圖是一種在數(shù)據(jù)庫中存儲視圖結(jié)果集的方法,可減少動態(tài)生成結(jié)果集的開銷。索引視圖還能自動反映出創(chuàng)建索引后對基表數(shù)據(jù)所做的修改

10、。7.1.2 索引的創(chuàng)建:索引的創(chuàng)建:CREATE INDEX【例7.5】 創(chuàng)建pxscj數(shù)據(jù)庫一個(gè)視圖,并為該視圖創(chuàng)建索引。T-SQL命令如下:CREATE VIEW dbo.vxs1 WITH SCHEMABINDING AS SELECT 學(xué)號, 姓名 FROM dbo.xsbGO/*在視圖上創(chuàng)建索引*/CREATE UNIQUE CLUSTERED INDEX inx1 ON dbo.vxs1(學(xué)號)GO7.1.3 重建索引:重建索引:ALTER INDEX索引使用一段時(shí)間后,可能需要重新創(chuàng)建。這時(shí),可以使用ALTER INDEX語句來重新生成原來的索引。語法格式:ALTER INDE

11、X 索引名 | ALL ON 表或視圖名 REBUILD 例如,重建kcb表上的所有索引:USE pxscjALTER INDEX ALL ON kcb REBUILD重建kcb表上的kc_name索引:ALTER INDEX kc_name ON kcb REBUILD7.1.4 索引的刪除:索引的刪除:DROP INDEX1界面方式刪除索引界面方式刪除索引在“對象資源管理器”中展開數(shù)據(jù)庫“pxscj”“表”“dbo.xsb”“索引”,選擇其中要?jiǎng)h除的索引,單擊鼠標(biāo)右鍵,在彈出的快捷菜單上選擇“刪除”菜單項(xiàng)。在打開的“刪除對象”窗口中單擊“確定”按鈕即可完成刪除操作。2通過執(zhí)行通過執(zhí)行SQL

12、命令刪除索引命令刪除索引從當(dāng)前數(shù)據(jù)庫中刪除一個(gè)或多個(gè)索引。語法格式:DROP INDEX 索引名 ON 表或視圖名 其中,索引名是要?jiǎng)h除的索引名稱。表或視圖名為索引所在的表名或視圖名。7.1.4 索引的刪除:索引的刪除:DROP INDEX另外,DROP INDEX語句可以一次刪除一個(gè)或多個(gè)索引。這個(gè)語句不適合刪除通過定義PRIMARY KEY或UNIQUE約束創(chuàng)建的索引。若要?jiǎng)h除PRIMARY KEY或UNIQUE約束創(chuàng)建的索引,必須通過刪除約束實(shí)現(xiàn)。另外,在系統(tǒng)表的索引上不能進(jìn)行DROP INDEX操作?!纠?.6】 刪除pxscj數(shù)據(jù)庫中表kcb的一個(gè)索引名為kc_name的索引。T-S

13、QL命令如下:IF EXISTS (SELECT name FROM sysindexes WHERE name = kc_name) DROP INDEX kcb.kc_name7.2 數(shù)據(jù)完整性數(shù)據(jù)完整性1實(shí)體完整性實(shí)體完整性(1)PRIMARY KEY約束。表中應(yīng)有一個(gè)列或列的組合,其值能唯一地標(biāo)識表中的每一行,選擇這樣的一列或多列作為主鍵,可實(shí)現(xiàn)表的實(shí)體完整性。通過定義PRIMARY KEY約束來創(chuàng)建主鍵。(2)UNIQUE約束。如果要確保一個(gè)表中的非主鍵列不輸入重復(fù)值,則應(yīng)在該列上定義唯一約束(UNIQUE約束)。例如,對于pxscj數(shù)據(jù)庫中的xsb表,“學(xué)號”列是主鍵,在xsb表中

14、增加一列“身份證號碼”,可以定義一個(gè)UNIQUE約束來要求表中“身份證號碼”列的取值是唯一的。7.2 數(shù)據(jù)完整性數(shù)據(jù)完整性PRIMARY KEY約束與UNIQUE約束的主要區(qū)別如下:(1)一個(gè)數(shù)據(jù)表只能創(chuàng)建一個(gè)PRIMARY KEY約束,但一個(gè)表中可根據(jù)需要對表中不同的列創(chuàng)建若干個(gè)UNIQUE約束。(2)PRIMARY KEY字段的值不允許為NULL,而UNIQUE字段的值可取NULL。(3)一般創(chuàng)建PRIMARY KEY約束時(shí),系統(tǒng)會自動產(chǎn)生索引,索引的默認(rèn)類型為簇索引。創(chuàng)建UNIQUE約束時(shí),系統(tǒng)會自動產(chǎn)生一個(gè)UNIQUE索引,索引的默認(rèn)類型為非簇索引。PRIMARY KEY約束與UNIQ

15、UE約束的相同點(diǎn)是:二者均不允許表中對應(yīng)字段存在重復(fù)值。7.2 數(shù)據(jù)完整性數(shù)據(jù)完整性2域完整性域完整性域完整性又稱為列完整性,指給定列輸入的有效性。實(shí)現(xiàn)域完整性的方法有:通過CHECK約束、數(shù)據(jù)類型、DEFALUT定義、NOT NULL定義和規(guī)則等。CHECK約束通過輸入到列中的值來實(shí)現(xiàn)域完整性;DEFAULT定義后,如果列中沒有輸入值,則填充默認(rèn)值來實(shí)現(xiàn)域完整性;通過定義列為NOT NULL限制輸入的值不能為空,也能實(shí)現(xiàn)域完整性。例如,對于學(xué)生數(shù)據(jù)庫pxscj的kcb表,學(xué)生的學(xué)分應(yīng)在16。為了對“學(xué)分”這一數(shù)據(jù)項(xiàng)輸入的數(shù)據(jù)范圍進(jìn)行限制,可以在定義kcb表的同時(shí)定義學(xué)分的約束條件來達(dá)到這一目

16、的。7.2 數(shù)據(jù)完整性數(shù)據(jù)完整性3參照完整性參照完整性參照完整性確保鍵值在所有表中一致。碼:即前面所說的關(guān)鍵字,又稱為“鍵”,是能唯一標(biāo)識表中記錄的字段或字段組合。如果一個(gè)表有多個(gè)碼,可選其中一個(gè)作為主鍵(主碼),其余的稱為候選鍵。外碼:如果一個(gè)表中的一個(gè)字段或若干個(gè)字段的組合是另一個(gè)表的碼,則稱該字段或字段組合為該表的外碼(外鍵)。例如,對于pxscj數(shù)據(jù)庫中的xsb表的每一個(gè)學(xué)號,在cjb表中都有相關(guān)的課程成績記錄,將xsb作為主表,“學(xué)號”字段定義為主鍵,cjb作為從表,表中的“學(xué)號”字段定義為外鍵,從而建立主表和從表之間的聯(lián)系,實(shí)現(xiàn)參照完整性。7.2 數(shù)據(jù)完整性數(shù)據(jù)完整性如果定義了兩個(gè)

17、表之間的參照完整性,則要求:(1)從表不能引用不存在的鍵值。例如,cjb表中行記錄出現(xiàn)的學(xué)號必須是xsb表中已存在的學(xué)號。(2)如果主表中的鍵值更改了,那么在整個(gè)數(shù)據(jù)庫中,對從表中該鍵值的所有引用要進(jìn)行一致的更改。例如,如果對xsb表中的某一學(xué)號進(jìn)行修改,則對cjb表中所有對應(yīng)的學(xué)號也要進(jìn)行相應(yīng)的修改。(3)如果主表中沒有關(guān)聯(lián)的記錄,則不能將記錄添加到從表。如果要?jiǎng)h除主表中的某一記錄,則應(yīng)先刪除從表中與該記錄匹配的相關(guān)記錄。7.2.1 創(chuàng)建實(shí)體完整性:創(chuàng)建實(shí)體完整性:PRIMARY KEY/UNIQUE1以界面方式創(chuàng)建和刪除主鍵約束以界面方式創(chuàng)建和刪除主鍵約束(1)創(chuàng)建主鍵約束。對表建立PRI

18、MARY KEY約束創(chuàng)建主鍵索引,以“PK_”為前綴、后跟表名命名,系統(tǒng)自動按聚集索引方式組織主鍵索引。(2)刪除主鍵約束。在“對象資源管理器”中選擇表,右擊鼠標(biāo),在彈出的快捷菜單中選擇“設(shè)計(jì)”菜單項(xiàng),進(jìn)入“表設(shè)計(jì)器”窗口。選中主鍵所對應(yīng)的行,右擊鼠標(biāo),在彈出的快捷菜單中選擇“刪除主鍵”菜單項(xiàng)即可。7.2.1 創(chuàng)建實(shí)體完整性:創(chuàng)建實(shí)體完整性:PRIMARY KEY/UNIQUE2以界面方式創(chuàng)建和刪除唯一性約束以界面方式創(chuàng)建和刪除唯一性約束(1)創(chuàng)建唯一性約束。如果要對kcb表中的“課程名”列創(chuàng)建UNIQUE約束,以保證該列取值的唯一性,則可進(jìn)入kcb表的“表設(shè)計(jì)器”窗口,選擇“課程名”屬性列并

19、右擊鼠標(biāo),在彈出的快捷菜單中選擇“索引/鍵”菜單項(xiàng),打開“索引/鍵”對話框。(2)刪除唯一性約束。打開如圖7.3所示的“索引/鍵”對話框,選擇要?jiǎng)h除的UNIQUE約束,單擊左下方的“刪除”按鈕,單擊“關(guān)閉”按鈕,保存表的修改即可刪除。7.2.1 創(chuàng)建實(shí)體完整性:創(chuàng)建實(shí)體完整性:PRIMARY KEY/UNIQUE3以命令方式創(chuàng)建及刪除主鍵約束或唯一性約束以命令方式創(chuàng)建及刪除主鍵約束或唯一性約束(1)在創(chuàng)建表的同時(shí)創(chuàng)建主鍵約束或唯一性約束。語法格式:CREATE TABLE 表名( , , . )7.2.1 創(chuàng)建實(shí)體完整性:創(chuàng)建實(shí)體完整性:PRIMARY KEY/UNIQUE其中,和的具體格式如

20、下: :=/*定義列的約束*/ CONSTRAINT 約束名 PRIMARY KEY | UNIQUE /*定義主鍵與UNIQUE鍵*/ CLUSTERED | NONCLUSTERED /*定義約束的索引類型*/ WITH ( , . ) ON 分區(qū)架構(gòu)名 ( 分區(qū)列名 ) | 文件組 | default | FOREIGN KEY /*定義外鍵*/ | CHECK NOT FOR REPLICATION ( 邏輯表達(dá)式 )/*定義CHECK約束*/ :=/*定義表的約束*/ CONSTRAINT 約束名 PRIMARY KEY | UNIQUE CLUSTERED | NONCLUSTER

21、ED (列 ASC | DESC , . )/*定義表的約束時(shí)需要指定列*/ WITH ( , . ) ON 分區(qū)架構(gòu)名 (分區(qū)列名) | 文件組 | default | FOREIGN KEY ( 列 , . ) | CHECK NOT FOR REPLICATION ( 邏輯表達(dá)式 )7.2.1 創(chuàng)建實(shí)體完整性:創(chuàng)建實(shí)體完整性:PRIMARY KEY/UNIQUE【例7.7】 在pxscj數(shù)據(jù)庫中創(chuàng)建xsb3表,并對“學(xué)號”字段創(chuàng)建主鍵約束,對“姓名”字段定義唯一性約束。USE pxscjGOCREATE TABLE xsb3( 學(xué)號 char(6) NOT NULLCONSTRAINT

22、xh_pk PRIMARY KEY, 姓名char(8) NOT NULLCONSTRAINT xm_uk UNIQUE, 性別 bit NOT NULLDEFAULT 1, 出生時(shí)間 date NOT NULL, 專業(yè) char(12) NULL, 總學(xué)分 int NULL, 備注 varchar(500) NULL) 7.2.1 創(chuàng)建實(shí)體完整性:創(chuàng)建實(shí)體完整性:PRIMARY KEY/UNIQUE(2)通過修改表創(chuàng)建主鍵約束或唯一性約束。使用ALTER TABLE語句中的ADD子句可以為表中已存在的列或新列定義約束,語法格式參見ALTER TABLE語句的ADD子句?!纠?.8】 修改xs

23、b3表,向其中添加一個(gè)“身份證號碼”字段,對該字段定義唯一性約束。對表中“出生時(shí)間”字段定義唯一性約束。ALTER TABLE xsb3 ADD 身份證號碼 char(20) CONSTRAINT sf_uk UNIQUE NONCLUSTERED (身份證號碼)GOALTER TABLE xsb3 ADD CONSTRAINT cssj_uk UNIQUE NONCLUSTERED (出生時(shí)間)GO創(chuàng)建主鍵約束或唯一性約束如圖7.4所示。7.2.1 創(chuàng)建實(shí)體完整性:創(chuàng)建實(shí)體完整性:PRIMARY KEY/UNIQUE(3)刪除主鍵約束或唯一性約束。)刪除主鍵約束或唯一性約束。刪除主鍵約束或唯

24、一性約束需要使用ALTER TABLE的DROP子句。語法格式:ALTER TABLE 表名DROP CONSTRAINT 約束名 , . 【例7.9】 刪除xsb3創(chuàng)建的sf_uk和xm_uk唯一性約束。ALTER TABLE xsb3DROP CONSTRAINT sf_uk, xm_ukGO7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE1CHECK約束的定義與刪除約束的定義與刪除CHECK(驗(yàn)證規(guī)則)約束實(shí)際上是字段輸入內(nèi)容的驗(yàn)證規(guī)則,表示一個(gè)字段的輸入內(nèi)容必須滿足CHECK約束的條件,若不滿足,則數(shù)據(jù)無法正常輸入。1)以界面方式創(chuàng)建與刪除)以界面方式創(chuàng)建與刪

25、除CHECK約束約束【例7.10】 在pxscj數(shù)據(jù)庫的cjb(成績)表中,要求用戶的輸入成績在0100之間。步驟如下:(1)在“對象資源管理器”中展開“數(shù)據(jù)庫”“pxscj”“表”,選擇“dbo.cjb”,展開后選擇“約束”,右擊鼠標(biāo),在出現(xiàn)的快捷菜單中選擇“新建約束”菜單項(xiàng)。(2)在打開的 “CHECK約束”對話框中,單擊“添加”按鈕,添加一個(gè)“CHECK約束”。在“常規(guī)”屬性區(qū)域中的“表達(dá)式”欄后面單擊 按鈕(或直接在文本框中輸入內(nèi)容),打開“CHECK約束表達(dá)式”窗口,并編輯相應(yīng)的CHECK約束表達(dá)式為“成績=0 AND 成績1994-01-01), 專業(yè) char(12) NULL

26、DEFAULT 計(jì)算機(jī), 總學(xué)分 int NULL DEFAULT 0, 備注varchar(500) NULL, CONSTRAINT cxh_zy CHECK(left(學(xué)號,2)=19 and 專業(yè)=計(jì)算機(jī) or left(學(xué)號,2)=22 and 專業(yè)=通信工程)GO7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE定義后,在xsb1表中輸入學(xué)號“220001”中的“22”與“計(jì)算機(jī)專業(yè)”不一致會顯示錯(cuò)誤信息,如圖7.6所示。7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE3)以命令方式在修改表時(shí)創(chuàng)建)以命令方式在修改表時(shí)創(chuàng)建CHECK

27、約束。約束。在使用ALTER TABLE語句修改表時(shí)也能定義CHECK約束。定義CHECK約束的語法格式為:ALTER TABLE 表名 WITH CHECK | NOCHECK ADDCONSTRAINT 約束名 CHECK (邏輯表達(dá)式)【例7.12】 通過修改pxscj數(shù)據(jù)庫的cjb表,增加“成績”字段的CHECK約束。USE pxscjGOALTER TABLE cjb ADD CONSTRAINT cj_constraint CHECK (成績=0 AND 成績=100) 7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE4)利用)利用SQL語句刪除語句刪除C

28、HECK約束約束語法格式:ALTER TABLE 表名 DROP CONSTRAINT 約束名【例7.12續(xù)】 刪除cjb表“成績”字段的CHECK約束。ALTER TABLE cjb DROP CONSTRAINT cj_constraint7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE2規(guī)則對象的定義、使用與刪除規(guī)則對象的定義、使用與刪除(1)規(guī)則對象的定義。語法格式:CREATE RULE 架構(gòu)名. 規(guī)則名 AS 條件表達(dá)式(2)將規(guī)則對象綁定到用戶定義數(shù)據(jù)類型或列。將規(guī)則對象綁定到列或用戶定義數(shù)據(jù)類型中可以使用系統(tǒng)存儲過程sp_bindrule。語法格式:s

29、p_bindrule rulename = 規(guī)則名 , objname = 對象名 , futureonly = futureonly標(biāo)志 7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE【例7.13】 如下程序創(chuàng)建一個(gè)規(guī)則,并綁定到表kcb的課程號列,用于限制課程號的輸入范圍。 (1)創(chuàng)建規(guī)則T-SQL命令。USE pxscjGOCREATE RULE kc_rule AS range like 1-50-90-9GOEXEC sp_bindrule kc_rule, kcb.課程號 /*執(zhí)行存儲過程使用EXEC命令*/GO程序如果正確執(zhí)行,則提示:“已將規(guī)則綁定到

30、表的列”。7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE(2)在“對象資源管理器”中展開“pxscj”“表”“dbo.kcb”“列”,右擊“課程號”,選擇“屬性”菜單項(xiàng),在kcb表的“列屬性-課程號”窗口的“規(guī)則”欄中可以查看已經(jīng)新建的規(guī)則?!纠?.14】 創(chuàng)建一個(gè)規(guī)則,用以限制輸入到該規(guī)則所綁定的列中的值只能是該規(guī)則中列出的值。CREATE RULE list_rule AS list IN (C語言, 離散數(shù)學(xué), 微機(jī)原理)GOEXEC sp_bindrule list_rule, kcb.課程名GO7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREAT

31、E RULE【例7.15】 如下程序定義一個(gè)用戶數(shù)據(jù)類型course_num,然后將前面定義的規(guī)則“kc_rule”綁定到用戶數(shù)據(jù)類型course_num上,最后創(chuàng)建表kcb1,其“課程號”的數(shù)據(jù)類型為course_num。CREATE TYPE course_num FROM char(3) NOT NULL/*創(chuàng)建用戶定義數(shù)據(jù)類型*/EXEC sp_bindrule kc_rule, course_num/*將規(guī)則對象綁定到用戶定義數(shù)據(jù)類型*/GOCREATE TABLE kcb1( 課程號 course_num, /*將學(xué)號定義為course_num類型*/ 課程名 char(16) N

32、OT NULL, 開課學(xué)期 tinyint , 學(xué)時(shí) tinyint, 學(xué)分 tinyint)GO7.2.2 創(chuàng)建域完整性:創(chuàng)建域完整性:CHECK/CREATE RULE(3)規(guī)則對象的刪除。)規(guī)則對象的刪除。在刪除規(guī)則對象前,首先應(yīng)使用系統(tǒng)存儲過程sp_unbindrule解除被綁定對象與規(guī)則對象之間的綁定關(guān)系,使用格式如下:sp_unbindrule objname = 對象名 , futureonly = futureonly標(biāo)志在解除列或自定義類型與規(guī)則對象之間的綁定關(guān)系后,就可以刪除規(guī)則對象了。語法格式:DROP RULE 架構(gòu)名. 規(guī)則名 , . ; 【例7.16】 解除規(guī)則kc

33、_rule與列或用戶定義類型的綁定關(guān)系,并刪除規(guī)則對象kc_rule。EXEC sp_unbindrule kcb.課程號EXEC sp_unbindrule course_numGODROP RULE kc_rule7.2.3 創(chuàng)建參照完整性:創(chuàng)建參照完整性:FOREIGN KEY1以界面方式定義表間的參照關(guān)系以界面方式定義表間的參照關(guān)系【例7.17】 通過學(xué)號實(shí)現(xiàn)xsb表與cjb表之間的參照完整性。操作步驟如下:(1)由于之前在創(chuàng)建表時(shí)已經(jīng)定義xsb表中的“學(xué)號”字段為主鍵,所以這里就不需要再定義主表的主鍵了。(2)在“對象資源管理器”中展開“數(shù)據(jù)庫”“pxscj”,選擇“數(shù)據(jù)庫關(guān)系圖”,

34、右擊鼠標(biāo),在出現(xiàn)的快捷菜單中選擇“新建數(shù)據(jù)庫關(guān)系圖”菜單項(xiàng),打開“添加表”窗口。(3)在出現(xiàn)的“添加表”窗口中選擇要添加的表,本例中選擇了表xsb和表cjb。單擊“添加”按鈕完成表的添加,之后單擊“關(guān)閉”按鈕退出窗口。(4)在“數(shù)據(jù)庫關(guān)系圖設(shè)計(jì)”窗口中將鼠標(biāo)指向主表的主鍵,并拖動到從表,即將xsb表中的“學(xué)號”字段拖動到從表cjb中的“學(xué)號”字段。7.2.3 創(chuàng)建參照完整性:創(chuàng)建參照完整性:FOREIGN KEY(5)在彈出的“表和列”對話框中輸入關(guān)系名、設(shè)置主鍵表和列名,單擊“表和列”對話框中的“確定”按鈕,再單擊“外鍵關(guān)系”對話框中的“確認(rèn)”按鈕,進(jìn)入如圖7.7所示的界面。7.2.3 創(chuàng)建

35、參照完整性:創(chuàng)建參照完整性:FOREIGN KEY(6)在彈出的“選擇名稱”對話框中輸入關(guān)系圖的名稱。單擊“確定”按鈕,在彈出的“保存”對話框中單擊“是”按鈕,保存設(shè)置。為提高查詢效率,在定義主表與從表的參照關(guān)系前,可考慮先對從表的外鍵定義索引,然后定義主表與從表間的參照關(guān)系。采用同樣方法,再添加kcb表并建立它與cjb表的參照完整性關(guān)系。之后,可以在pxscj數(shù)據(jù)庫的“數(shù)據(jù)庫關(guān)系圖”目錄下看到所創(chuàng)建的參照關(guān)系,如圖7.8所示。7.2.3 創(chuàng)建參照完整性:創(chuàng)建參照完整性:FOREIGN KEY2以界面方式刪除表間的參照關(guān)系以界面方式刪除表間的參照關(guān)系(1)如果要?jiǎng)h除前面建立的xsb表與cjb表

36、之間的參照關(guān)系,可在pxscj數(shù)據(jù)庫的“數(shù)據(jù)庫關(guān)系圖”目錄下選擇要修改的關(guān)系圖,如Diagram_0,右擊鼠標(biāo),在彈出的快捷菜單中選擇“修改”菜單項(xiàng),打開“數(shù)據(jù)庫關(guān)系圖設(shè)計(jì)”窗口。(2)在“數(shù)據(jù)庫關(guān)系圖設(shè)計(jì)”窗口中,選擇已經(jīng)建立的“關(guān)系”,單擊鼠標(biāo)右鍵,選擇“從數(shù)據(jù)庫中刪除關(guān)系”,在隨后彈出的對話框中,單擊“是”按鈕,刪除表之間的關(guān)系。7.2.3 創(chuàng)建參照完整性:創(chuàng)建參照完整性:FOREIGN KEY3以命令方式定義表間的參照關(guān)系以命令方式定義表間的參照關(guān)系1)在創(chuàng)建表的同時(shí)定義外鍵約束)在創(chuàng)建表的同時(shí)定義外鍵約束創(chuàng)建表語法格式中的在前面已經(jīng)列出,這里只列出定義外鍵部分的語法。CREATE TABLE 表名/*指定表名*/( CONSTRAINT 約束名 FOREIGN KEY ( 列 , . ) )7.2.3 創(chuàng)建參照完整性:創(chuàng)建參照完整性:FOREIGN KEY說明:說明:和主鍵一樣,外鍵也可以定義為列的約束或表的約束。如果定義為列的約束,則直接在列定義后面使用FOREIGN KEY關(guān)鍵字定義該字段為

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論