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

下載本文檔

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

文檔簡介

第8章數(shù)據(jù)完整性1本章內(nèi)容8.1數(shù)據(jù)完整性概述8.2使用規(guī)則實(shí)施數(shù)據(jù)完整性8.3使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.4使用約束實(shí)施數(shù)據(jù)完整性28.1數(shù)據(jù)完整性概述數(shù)據(jù)完整性防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無效操作或錯(cuò)誤信息而提出的。數(shù)據(jù)完整性有4種類型:實(shí)體完整性(EntityIntegrity)、域完整性(DomainIntegrity)、參照完整性(ReferentialIntegrity)、用戶定義的完整性(User-definedIntegrity)。在SQLServer中可以通過各種規(guī)則(Rule)、默認(rèn)(Default)、約束(Constraint)和觸發(fā)器(Trigger)等數(shù)據(jù)庫對象來保證數(shù)據(jù)的完整性。38.2使用規(guī)則實(shí)施數(shù)據(jù)完整性8.2.1創(chuàng)建規(guī)則8.2.2查看和修改規(guī)則8.2.3規(guī)則的綁定與松綁8.2.4刪除規(guī)則48.2.1創(chuàng)建規(guī)則規(guī)則(Rule)就是數(shù)據(jù)庫中對存儲在表的列或用戶定義數(shù)據(jù)類型中的值的規(guī)定和限制。規(guī)則是單獨(dú)存儲的獨(dú)立的數(shù)據(jù)庫對象。規(guī)則和約束可以同時(shí)使用,表的列可以有一個(gè)規(guī)則及多個(gè)約束。規(guī)則與檢查約束在功能上相似,但在使用上有所區(qū)別。檢查約束是在CREATETABLE或ALTERTABLE語句中定義的,嵌入了被定義的表結(jié)構(gòu),即刪除表的時(shí)候檢查約束也就隨之被刪除。而規(guī)則需要用CREATERULE語句定義后才能使用,是獨(dú)立于表之外的數(shù)據(jù)庫對象,刪除表并不能刪除規(guī)則,需要用DROPRULE語句才能刪除。相比之下,使用在CREATETABLE或ALTERTABLE語句中定義的檢查約束是更標(biāo)準(zhǔn)的限制列值的方法,但檢查約束不能直接作用于用戶定義數(shù)據(jù)類型。51.用企業(yè)管理器創(chuàng)建規(guī)則8.2.1創(chuàng)建規(guī)則在企業(yè)管理器中選擇數(shù)據(jù)庫對象“規(guī)則”,單擊右鍵從快捷菜單中選擇“新建規(guī)則”選項(xiàng),即會(huì)彈出如圖所示的“規(guī)則屬性”對話框。輸入規(guī)則名稱和表達(dá)式之后,單擊“確定”按鈕,即完成規(guī)則的創(chuàng)建。62.用CREATERULE語句創(chuàng)建規(guī)則8.2.1創(chuàng)建規(guī)則CREATERULE語句用于在當(dāng)前數(shù)據(jù)庫中創(chuàng)建規(guī)則,其語法格式如下:

CREATERULErule_nameAS

condition_expressioncondition_expression中的變量必須以@開頭,且可以任意命名!78.2.1創(chuàng)建規(guī)則例8-2創(chuàng)建性別規(guī)則sex_rule。CREATERULEsex_ruleAS@sexin('男','女')例8-1創(chuàng)建雇傭日期規(guī)則hire_date_rule。

CREATERULEhire_date_rule

AS

@hire_date>='1980-01-01'and@hire_date<=getdate()

88.2.1創(chuàng)建規(guī)則例8-4創(chuàng)建字符規(guī)則my_character_rule。CREATERULEmy_character_ruleAS@valuelike'[a-z]%[0-9]'

例8-3創(chuàng)建評分規(guī)則grade_rule。

CREATERULEgrade_rule

AS

@valuebetween1and100

91.用企業(yè)管理器查看和修改規(guī)則在企業(yè)管理器的數(shù)據(jù)庫對象中選擇“規(guī)則”對象,即可從右邊的任務(wù)板中看到規(guī)則的大部分信息,包括規(guī)則的名稱、所有者、創(chuàng)建時(shí)間等。8.2.2查看和修改規(guī)則108.2.2查看和修改規(guī)則使用sp_helptext

系統(tǒng)存儲過程可以查看規(guī)則的文本信息。例8-5查看規(guī)則hire_date_rule的文本信息EXECUTEsp_helptext

hire_date_rule運(yùn)行結(jié)果如圖所示2.用系統(tǒng)存儲過程sp_helptext

查看規(guī)則118.2.3規(guī)則的綁定與松綁需要將規(guī)則與數(shù)據(jù)庫表或用戶定義對象聯(lián)系起來,才能發(fā)生作用。聯(lián)系的方法稱為綁定,所謂綁定就是指定規(guī)則作用于哪個(gè)表的哪一列或哪個(gè)用戶定義數(shù)據(jù)類型。表的一列或一個(gè)用戶定義數(shù)據(jù)類型只能與一個(gè)規(guī)則相綁定,而一個(gè)規(guī)則可以綁定多對象,這正是規(guī)則的魅力所在。解除規(guī)則與對象的綁定稱為松綁。128.2.3規(guī)則的綁定與松綁在企業(yè)管理器中,展開數(shù)據(jù)庫(Sales)文件夾,鼠標(biāo)單擊“規(guī)則”選項(xiàng),在右窗格中選擇要進(jìn)行綁定的規(guī)則(hire_date),單擊鼠標(biāo)右鍵,從快捷菜單中選擇“屬性”菜單項(xiàng),打開“規(guī)則屬性”對話框,如圖8-4所示。圖中的“綁定UDT(U)”按鈕用于綁定規(guī)則到用戶定義的數(shù)據(jù)類型,“綁定列(B)”按鈕用于綁定規(guī)則到表的列。1.用企業(yè)管理器管理規(guī)則的綁定和松綁138.2.3規(guī)則的綁定與松綁在圖8-4中單擊“綁定UDT(U)”按鈕,則出現(xiàn)“將綁定規(guī)則到用戶定義的數(shù)據(jù)類型”對話框,如圖8-5所示;148.2.3規(guī)則的綁定與松綁單擊“綁定列(B)”按鈕,則出現(xiàn)如圖8-6所示的“將綁定規(guī)則到列”對話框。在“將規(guī)則綁定列”對話框的左邊“未綁定的列”列表框中選擇一列“添加”到右邊“綁定列”列表框中,就實(shí)現(xiàn)規(guī)則綁定了。同樣,去掉“將規(guī)則綁定到用戶定義的數(shù)據(jù)類型”對話框的列表框的“綁定”列下的標(biāo)識或刪除“將規(guī)則綁定列”對話框的右邊“綁定列”列表框的列,就實(shí)現(xiàn)了規(guī)則的松綁操作。158.2.3規(guī)則的綁定與松綁2.用系統(tǒng)存儲過程sp_bindrule綁定規(guī)則系統(tǒng)存儲過程sp_bindrule

可以綁定一個(gè)規(guī)則到表的一個(gè)列或一個(gè)用戶定義數(shù)據(jù)類型上。其語法格式如下:sp_bindrule[@rulename=]'rule',[@objname=]'object_name'[,[@futureonly=]'futureonly']object_name的表示方法為:表名.字段名綁定到自定義數(shù)據(jù)類型上使用futureonly選項(xiàng)。16例8-7定義用戶定義數(shù)據(jù)類型pat_char,將例8-4創(chuàng)建的規(guī)則my_character_rule綁定到pat_var上。EXECsp_addtypepat_char,'varchar(10)','NOTNULL'GOEXECsp_bindrule

my_character_rule,pat_char,'futureonly‘例8-6將例8-1創(chuàng)建的規(guī)則hire_date_rule綁定到employee表的hire_date列上。

EXECsp_bindrule

hire_date_rule,'employee.hire_date'17例8-8綁定例8-2創(chuàng)建的規(guī)則sex_rule

到employee表的字段sex。

EXECsp_bindrule

sex_rule,'employee.sex'188.2.3規(guī)則的綁定與松綁系統(tǒng)存儲過程sp_unbindrule可解除規(guī)則與列或用戶定義數(shù)據(jù)類型的綁定,其語法格式如下:sp_unbindrule[@objname=]'object_name'[,[@futureonly=]'futureonly']3.用系統(tǒng)存儲過程sp_unbindrule

解除規(guī)則的綁定object_name的表示方法為:表名.字段名綁定到自定義數(shù)據(jù)類型上使用futureonly選項(xiàng)。198.2.3規(guī)則的綁定與松綁例8-9解除例8-6和例8-7綁定在employee表的hire_date列和用戶定義數(shù)據(jù)類型pat_char上的規(guī)則。解除綁定在employee表的hire_date列的規(guī)則。EXECsp_unbindrule'employee.hire_date'解除綁定用戶定義數(shù)據(jù)類型pat_char上的規(guī)則。EXECsp_unbindrule

pat_char,'futureonly'208.2.4刪除規(guī)則使用DROPRULE語句刪除當(dāng)前數(shù)據(jù)庫中的一個(gè)或多個(gè)規(guī)則。其語法格式如下:DROPRULE{rule_name}[,...n]注意:在刪除一個(gè)規(guī)則前,必須先將與其綁定的對象解除綁定。例8-10刪除例8-1和8-2中創(chuàng)建的規(guī)則。DROPRULEsex_rule,hire_date_rule

218.3.1創(chuàng)建默認(rèn)值8.3.2查看默認(rèn)值8.3.3默認(rèn)值的綁定與松綁8.3.4刪除默認(rèn)值8.3使用默認(rèn)值實(shí)施數(shù)據(jù)完整性228.3使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3.1創(chuàng)建默認(rèn)值默認(rèn)值(Default)是用戶輸入記錄時(shí)往沒有指定具體數(shù)據(jù)的列中自動(dòng)插入的數(shù)據(jù)。默認(rèn)值對象與CREATETABLE或ALTERTABLE語句操作表時(shí)用默認(rèn)約束指定的默認(rèn)值功能相似,兩者的區(qū)別類似于規(guī)則與檢查約束在使用上的區(qū)別。默認(rèn)值對象可以用于多個(gè)列或用戶定義數(shù)據(jù)類型。表的一列或一個(gè)用戶定義數(shù)據(jù)類型只能與一個(gè)默認(rèn)值相綁定。默認(rèn)值的創(chuàng)建、查看、綁定、松綁和刪除等操作可在企業(yè)管理器中進(jìn)行,也可利用Transact-SQL語句進(jìn)行。238.3.1創(chuàng)建默認(rèn)值8.3.1創(chuàng)建默認(rèn)值1.用企業(yè)管理器創(chuàng)建默認(rèn)值在企業(yè)管理器中選擇數(shù)據(jù)庫對象的“默認(rèn)值”對象,單擊右鍵,從快捷菜單中選擇“新建默認(rèn)值”選項(xiàng),打開“默認(rèn)屬性”對話框,如圖8-7所示。輸入默認(rèn)值名稱和值表達(dá)式之后,單擊“確定”按鈕,即完成默認(rèn)值的創(chuàng)建。248.3.1創(chuàng)建默認(rèn)值2.用CREATEDEFAULT語句創(chuàng)建默認(rèn)值CREATEDEFAULT語句用于在當(dāng)前數(shù)據(jù)庫中創(chuàng)建默認(rèn)值對象,其語法格式如下:CREATEDEFAULTdefault_nameASconstant_expression258.3.1創(chuàng)建默認(rèn)值例8-11創(chuàng)建生日默認(rèn)值birthday_defa。

CREATEDEFAULTbirthday_defaAS'1978-1-1'例8-12創(chuàng)建當(dāng)前日期默認(rèn)值today_defa。CREATEDEFAULTtoday_defaASgetdate()261.用企業(yè)管理器查看默認(rèn)值在企業(yè)管理器中選擇數(shù)據(jù)庫對象的“默認(rèn)值”對象,即可從右邊的任務(wù)板中看到默認(rèn)值的大部分信息,如圖8-8所示。8.3.2查看默認(rèn)值8.3使用默認(rèn)值實(shí)施數(shù)據(jù)完整性278.3.2查看默認(rèn)值選擇要查看的默認(rèn)值,單擊右鍵,從快捷菜單中選擇“屬性”選項(xiàng),就會(huì)出現(xiàn)圖8-9所示的“默認(rèn)屬性”對話框,可以從中編輯默認(rèn)值的值表達(dá)式。282.用系統(tǒng)存儲過程sp_helptext

查看默認(rèn)值使用sp_helptext系統(tǒng)存儲過程可以查看默認(rèn)值的細(xì)節(jié)。例8-13查看默認(rèn)值today_defa。EXECsp_helptext

today_defa運(yùn)行結(jié)果如下8.3.2查看默認(rèn)值298.3.3默認(rèn)值的綁定與松綁1.用企業(yè)管理器管理默認(rèn)值的綁定和松綁在企業(yè)管理器中,選擇要進(jìn)行綁定設(shè)置的默認(rèn)值,單擊右鍵,從快捷菜單中選擇“屬性”選項(xiàng),打開“默認(rèn)屬性”對話框,參見圖8-9。圖8-9中的“綁定UDT(U)”按鈕用于將默認(rèn)值綁定到用戶定義數(shù)據(jù)類型,“綁定列(B)”按鈕用于將默認(rèn)值綁定到表的列。單擊“綁定UDT(U)”按鈕,則出現(xiàn)如圖8-11所示的“將綁定默認(rèn)值到用戶定義的數(shù)據(jù)類型”對話框8.3使用默認(rèn)值實(shí)施數(shù)據(jù)完整性308.3.3默認(rèn)值的綁定與松綁單擊“綁定列(B)”按鈕,則出現(xiàn)如圖8-12所示的“將綁定默認(rèn)值到表的列”對話框。管理默認(rèn)值與用戶定義數(shù)據(jù)類型以及表的列之間的綁定和松綁與規(guī)則相同。318.3.3默認(rèn)值的綁定與松綁2.用sp_bindefault

綁定默認(rèn)值系統(tǒng)存儲過程sp_bindefault

可以綁定一個(gè)默認(rèn)值到表的一個(gè)列或一個(gè)用戶定義數(shù)據(jù)類型上。其語法格式如下:sp_bindefault[@defname=]'default',[@objname=]'object_name'[,[@futureonly=]'futureonly']object_name的表示方法為:表名.字段名綁定到自定義數(shù)據(jù)類型上使用futureonly選項(xiàng)。328.3.3默認(rèn)值的綁定與松綁例8-14綁定默認(rèn)值today_defa

到employee表的hire_date列上。

EXECsp_bindefault

today_defa,'employee.hire_date'338.3.3默認(rèn)值的綁定與松綁3.用sp_unbindefault

解除默認(rèn)值的綁定系統(tǒng)存儲過程sp_unbindefault

可以解除默認(rèn)值與表的列或用戶定義數(shù)據(jù)類型的綁定,其語法格式如下:

sp_unbindefault[@objname=]'object_name' [,[@futureonly=]'futureonly']object_name的表示方法為:表名.字段名綁定到自定義數(shù)據(jù)類型上使用futureonly選項(xiàng)。348.3.3默認(rèn)值的綁定與松綁例8-15解除默認(rèn)值today_defa與表employee的hire_date

列的綁定。

EXECsp_unbindefault'employee.hire_date'358.3使用默認(rèn)值實(shí)施數(shù)據(jù)完整性8.3.4刪除默認(rèn)值可以在企業(yè)管理器中選擇默認(rèn)值,單擊右鍵,從快捷菜單中選擇“刪除”選項(xiàng)刪除默認(rèn)值,也可以使用DROPDEFAULT語句刪除當(dāng)前數(shù)據(jù)庫中的一個(gè)或多個(gè)默認(rèn)值。其語法格式如下:DROPDEFAULT{default_name}[,...n]例8-16刪除生日默認(rèn)值birthday_defa。DROPDEFAULTbirthday_defa368.4.1主鍵約束8.4.2外鍵約束8.4.3惟一性約束8.4.4檢查約束8.4.5默認(rèn)約束8.4使用約束實(shí)施數(shù)據(jù)完整性378.4使用約束實(shí)施數(shù)據(jù)完整性約束(Constraint)是SQLServer提供的自動(dòng)保持?jǐn)?shù)據(jù)庫完整性的一種機(jī)制,它定義了可輸入表或表的單個(gè)列中的數(shù)據(jù)的限制條件。使用約束優(yōu)先于使用觸發(fā)器、規(guī)則和默認(rèn)值。約束獨(dú)立于表結(jié)構(gòu),作為數(shù)據(jù)庫定義部分在CREATETABLE語句中聲明,可以在不改變表結(jié)構(gòu)的基礎(chǔ)上,通過ALTERTABLE語句添加或刪除。當(dāng)表被刪除時(shí),表所帶的所有約束定義也隨之被刪除。388.4.1主鍵約束在SQLServer中有6種約束主鍵約束外鍵約束惟一性約束檢查約束默認(rèn)約束非空值約束 其中非空值約束已在第5章中做了詳細(xì)介紹,本節(jié)介紹其他5種約束。398.4.1主鍵約束表的一列或幾列的組合的值在表中惟一地指定一行記錄,這樣的一列或多列稱為表的主鍵(PrimaryKey,PK),通過它可強(qiáng)制表的實(shí)體完整性。主鍵不允許為空值,且不同兩行的鍵值不能相同。表中可以有不止一個(gè)鍵惟一標(biāo)識行,每個(gè)鍵都稱為侯選鍵,只可以選一個(gè)侯選鍵作為表的主鍵,其他侯選鍵稱作備用鍵。如果一個(gè)表的主鍵由單列組成,則該主鍵約束可以定義為該列的列約束。如果主鍵由兩個(gè)以上的列組成,則該主鍵約束必須定義為表約束。8.4.1主鍵約束408.4.1主鍵約束定義列級主鍵約束的語法格式如下:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]定義表級主鍵約束的語法格式如下:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]{(column_name[,…n])}418.4.1主鍵約束例8-17在Sales數(shù)據(jù)庫中創(chuàng)建customer表,并聲明主鍵約束。

CREATETABLESales.dbo.customer(customer_id

bigintNOTNULLIDENTITY(0,1)PRIMARYKEY,

customer_namevarchar(50)NOTNULL,

linkman_namechar(8),addressvarchar(50),telephonechar(12)NOTNULL)428.4.1主鍵約束非聚集主鍵約束主鍵約束默認(rèn)為聚集的,若要定義customer_id列為非聚集主鍵約束,并指定約束名為PK_customer,使用以下語句:

customer_idchar(5)CONSTRAINTPK_customerPRIMARYKEYNONCLUSTERED438.4.1主鍵約束例8-18創(chuàng)建一個(gè)產(chǎn)品信息表goods1,將產(chǎn)品編號goods_id列聲明為主鍵。

CREATETABLEgoods1(goods_idchar(6)NOTNULL,

goods_namevarchar(50)NOTNULL,

classification_idchar(6)NOTNULL,

unit_pricemoneyNOTNULL,

stock_quantityfloatNOTNULL,

order_quantityfloatNULL

CONSTRAINTpk_p_idPRIMARYKEY(goods_id))ON[PRIMARY]448.4.1主鍵約束例8-19根據(jù)商品銷售的時(shí)間和商品類別來確定銷售的商品的數(shù)量。

CREATETABLEg_order(good_type

int,

order_time

datetime,

order_num

int,

CONSTRAINTg_o_keyPRIMARYKEY(good_type,order_time))458.4使用約束實(shí)施數(shù)據(jù)完整性8.4.2外鍵約束外鍵約束定義了表與表之間的關(guān)系。通過將一個(gè)表中一列或多列添加到另一個(gè)表中,創(chuàng)建兩個(gè)表之間的連接,這個(gè)列就成為第二個(gè)表的外鍵(ForeignKey,F(xiàn)K),即外鍵是用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間的連接的一列或多列,通過它可以強(qiáng)制參照完整性。468.4.2外鍵約束例如,Sales數(shù)據(jù)庫中的employee、sell_order、goods這3個(gè)表之間存在以下邏輯聯(lián)系:sell_order(銷售訂單)表中employee_id(員工編號)列的值必須是employee表employee_id列中的某一個(gè)值,因?yàn)楹炗嗕N售訂單的人必須是當(dāng)前公司員工;而sell_order表中g(shù)oods_id(貨物編號)列的值必須是goods(貨物)表的goods_id列中的某一個(gè)值,因?yàn)殇N售訂單上售出的只能是已知貨物。因此,在sell_order表上應(yīng)建立兩個(gè)外鍵約束FK_sell_order_employee和FK_sell_order_goods來限制sell_order表employee_id列和goods_id列的值必須分別來自employee表的employee_id列及goods表的goods_id列。478.4.2外鍵約束級聯(lián)操作SQLServer提供了兩種級聯(lián)操作以保證數(shù)據(jù)完整性:(1)級聯(lián)刪除確定當(dāng)主鍵表中某行被刪除時(shí),外鍵表中所有相關(guān)行將被刪除。(2)級聯(lián)修改確定當(dāng)主鍵表中某行的鍵值被修改時(shí),外鍵表中所有相關(guān)行的該外鍵值也將被自動(dòng)修改為新值。488.4.2外鍵約束外鍵約束與主鍵約束相同,也分為表約束與列約束。定義列級外鍵約束的語法格式如下:[CONSTRAINTconstraint_name][FOREIGNKEY]REFERENCESref_table[(ref_column[,…n])][NOTFORREPLICATION]定義表級外鍵約束的語法格式如下:[CONSTRAINTconstraint_name]FOREIGNKEY(column_name[,…n])REFERENCESref_table[(ref_column[,…n])][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}]][NOTFORREPLICATION]498.4.2外鍵約束例8-20創(chuàng)建一個(gè)訂貨表sell_order1,與例8-18創(chuàng)建的產(chǎn)品表goods1相關(guān)聯(lián)。

CREATETABLEsell_order1(order_id1char(6)NOTNULL,

goods_idchar(6)NOTNULL,

employee_idchar(4)NOTNULL,

customer_idchar(4)NOTNULL,

transporter_idchar(4)NOTNULL,

order_numfloatNULL,discountfloatNULL,

order_date

datetimeNOTNULL,

send_date

datetimeNULL,

arrival_date

datetimeNULL,costmoneyNULL,

CONSTRAINTpk_order_idPRIMARYKEY(order_id1),

FOREIGNKEY(goods_id)REFERENCESgoods1(goods_id))508.4.2外鍵約束例8-21創(chuàng)建表sell_order2,并為goods_id、employee_id、custom_id三列定義外鍵約束。

CREATETABLEsell_order2(order_id1char(6)PRIMARYKEY,

goods_idchar(6)NOTNULL

CONSTRAINTFK_goods_idFOREIGNKEY(goods_id)REFERENCESGoods1(goods_id)ONDELETENOACTIONONUPDATECASCADE,

employee_idchar(4)NOTNULL

FOREIGNKEY(employee_id)REFERENCESemployee(employee_id)ONUPDATECASCADE,

customer_idchar(4)NOTNULL,

transporter_idchar(4)NOTNULL,

order_numfloat,discountfloat,

order_date

datetimeNOTNULL,

send_date

datetime,

arrival_date

datetime,costmoney,

CONSTRAINTFK_customer_idFOREIGNKEY(customer_id)REFERENCEScustomer(customer_id))518.4.2外鍵約束employee_id列的外鍵應(yīng)當(dāng)定義如下:CONSTRAINTFK_sell_order_employee

FOREIGNKEY(department_id,employee_id)REFERENCESemployee(department_id,employee_id)例如,如果employee表的主鍵是由department_id和employee_id組成的復(fù)合主鍵,則sell_order表中應(yīng)增加相同類型的department_id列定義528.4使用約束實(shí)施數(shù)據(jù)完整性8.4.3惟一性約束惟一性(Unique)約束指定一個(gè)或多個(gè)列的組合的值具有惟一性,以防止在列中輸入重復(fù)的值,為表中的一列或者多列提供實(shí)體完整性。惟一性約束指定的列可以有NULL屬性。主鍵也強(qiáng)制執(zhí)行惟一性,但主鍵不允許空值,故主鍵約束強(qiáng)度大于惟一約束。因此主鍵列不能再設(shè)定惟一性約束。538.4.3惟一性約束定義列級惟一性約束的語法格式如下:[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED]惟一性約束應(yīng)用于多列時(shí)的定義格式:[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED](column_name[,…n])548.4.3惟一性約束例8-22創(chuàng)建goods2表,使goods_name具有惟一性約束。

CREATETABLEgoods2(goods_idchar(6)NOTNULL

PRIMARYKEY,

goods_namevarchar(50)NOTNULL

CONSTRAINTu_goods_nameUNIQUENONCLUSTERED,

classification_idchar(6)NOTNULL,

unit_pricemoneyNOTNULL,

stock_quantityfloatNOTNULL,

order_quantityfloat)558.4.3惟一性約束例8-23定義一個(gè)員工信息表employees,其中員工的身份證號emp_cardid列具有惟一性。

CREATETABLEemployees(emp_idchar(8),

emp_namechar(10),

emp_cardidchar(18),

CONSTRAINTpk_emp_idPRIMARYKEY(emp_id),

CONSTRAINTuk_emp_cardidUNIQUE(emp_cardid))568.4使用約束實(shí)施數(shù)據(jù)完整性8.4.4檢查約束檢查(Check)約束對輸入列或整個(gè)表中的值設(shè)置檢查條件,以限制輸入值,保證數(shù)據(jù)庫的數(shù)據(jù)完整性。當(dāng)對具有檢查約束列進(jìn)行插入或修改時(shí),SQLServer將用該檢查約束的邏輯表達(dá)式對新值進(jìn)行檢查,只有滿足條件(邏輯表達(dá)式返回TRUE)的值才能填入該列,否則報(bào)錯(cuò)??梢詾槊苛兄付ǘ鄠€(gè)CHECK約束。578.4.4檢查約束定義檢查約束的語法格式:[CONSTRAINTconstraint_name]CHECK[NOTFORREPLICATION](logical_expression)588.4.4檢查約束例8-24更改表employee2以添加未驗(yàn)證檢查約束。

ALTERTABLEemployee2WITHNOCHECKADDCONSTRAINTCK_AgeCHECK(DATEDIFF(year,Birth_Date,Hire_Date)>18)598.4.4檢查約束例8-25創(chuàng)建一個(gè)訂貨表orders,保證各訂單的訂貨量必須不小于10。

CREATETABLEorders(order_idchar(8),

p_idchar(8),

p_namechar(10),quantitysmallint,

CONSTRAINTchk_quantityCHECK(quantity>=10),

CONSTRAINTpk_orders_idPRIMARYKEY(order_id)

)60例8-26創(chuàng)建transporters表并定義檢查約束CREATETABLEtransporters(transporter_idchar(4)NOTNULL,

transport_namevarchar(50),

linkman_namechar(8),addressvarchar(50),telephonechar(12)NOTNULL

CHECK(telephoneLIKE'0[1-9][0-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9]'ORtelephoneLIKE'0[1-9][0-9]-[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'))618.4使用約束實(shí)施數(shù)據(jù)完整性8.4.5默認(rèn)約束默認(rèn)(Default)約束通過定義列的默認(rèn)值或使用數(shù)據(jù)庫的默認(rèn)值對象綁定表的列,以確保在沒有為某列指定數(shù)據(jù)時(shí),來指定列的值。默認(rèn)值可以是常量,也可以是表達(dá)式,還可以為NULL值。628.4.5默認(rèn)約束定義默認(rèn)約束的語法格式[CONSTRAINTconstraint_name]DEFAULTconstant_expression[FORcolumn_name]638.4.5默認(rèn)約束例8-27在Sales數(shù)據(jù)庫中,為員工表employee的sex列添加默認(rèn)約束,默認(rèn)值是“男”。

ALTERTABLEemployeeADDCONSTRAINTsex_defaultDEFAULT'男'FORsex例8-28更改表employee為hire_date列定義默認(rèn)約束。ALTERTABLEemployeeADDCONSTRAINThire_date_dfDEFAULT(getdate())FORhire_date648.4.5默認(rèn)約束例8-29添加具有默認(rèn)值的可為空的列ALTERTABLEemployeeADDhire_date

datetimeDEFAULT(getdate())WITHVALUES658.4.5默認(rèn)約束例8-30使用默認(rèn)約束。

--創(chuàng)建表purchase_orderCREATETABLEpurchase_o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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

提交評論