




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章數(shù)據(jù)完整性1第9章數(shù)據(jù)完整性1本章內(nèi)容9.1數(shù)據(jù)完整性9.2約束9.3規(guī)則9.4默認(rèn)值2本章內(nèi)容9.1數(shù)據(jù)完整性29.1數(shù)據(jù)完整性數(shù)據(jù)完整性是指數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)的一致性和正確性,確保各個(gè)文件或表中的數(shù)據(jù)值的關(guān)系一致,確保數(shù)據(jù)庫(kù)中的數(shù)據(jù)可以成功和正確地更新。數(shù)據(jù)庫(kù)設(shè)計(jì)的一項(xiàng)重要內(nèi)容是確定如何加強(qiáng)數(shù)據(jù)的完整性。39.1數(shù)據(jù)完整性39.1數(shù)據(jù)完整性關(guān)系數(shù)據(jù)完整性關(guān)系數(shù)據(jù)完整性包括一下內(nèi)容:(1)實(shí)體完整性實(shí)體完整性就是把表中每一條記錄看作一個(gè)實(shí)體,要求所有行都具有唯一標(biāo)識(shí),即主鍵,且主鍵的值非空,又稱為行完整性。(2)域完整性域完整性是關(guān)于數(shù)據(jù)列取值有效性的限制。域完整性通常用有效性檢查來實(shí)現(xiàn),也可以通過限制數(shù)據(jù)類型、格式或者可能的取值范圍來實(shí)現(xiàn)。例如,對(duì)于teaching數(shù)據(jù)庫(kù)中s_c表中,GRADE字段的取值只能是從0到100的整數(shù)值,而不能為其他數(shù)值。49.1數(shù)據(jù)完整性關(guān)系數(shù)據(jù)完整性49.1數(shù)據(jù)完整性(3)參照完整性參照完整性是對(duì)外鍵取值有效性的限制,以確保數(shù)據(jù)在另一個(gè)參照表的取值范圍內(nèi)。參照完整性要求外鍵的取值只能取參照表中的有效值或空值。如果在參考表中某一記錄的主鍵被依賴表中的外部鍵參考,那么這一記錄既不能刪除,也不能修改其主鍵值,以確保關(guān)鍵字的一致性。(4)用戶定義完整性用戶定義完整性允許特定的不屬于上述類別規(guī)則的完整性定義,前面的3個(gè)完整性類型都支持用戶定義完整性。實(shí)現(xiàn)用戶定義完整性,可以有兩種方法,即聲明數(shù)據(jù)完整性和過程數(shù)據(jù)完整性。59.1數(shù)據(jù)完整性(3)參照完整性59.1數(shù)據(jù)完整性聲明數(shù)據(jù)完整性聲明數(shù)據(jù)完整性是通過在對(duì)象定義中定義的標(biāo)準(zhǔn)來實(shí)現(xiàn)數(shù)據(jù)完整性,是由系統(tǒng)本身的自動(dòng)強(qiáng)制來實(shí)現(xiàn)的,它包括使用各種約束、缺省的規(guī)則。過程數(shù)據(jù)完整性過程數(shù)據(jù)完整性是通過在腳本語言中定義的完整性標(biāo)準(zhǔn)來實(shí)現(xiàn)的,當(dāng)執(zhí)行這些腳本時(shí),就可以強(qiáng)制完整性的實(shí)現(xiàn)。過程數(shù)據(jù)完整性的方式包括使用觸發(fā)器和存儲(chǔ)過程等。69.1數(shù)據(jù)完整性聲明數(shù)據(jù)完整性69.1數(shù)據(jù)完整性SQLServer2005中的數(shù)據(jù)完整性
各類數(shù)據(jù)完整性和對(duì)應(yīng)實(shí)現(xiàn)完整性的SQLServer組件如表9.1所示。數(shù)據(jù)完整性對(duì)應(yīng)的SQLServer組件實(shí)體完整性PRIMARYKEY(主鍵)約束、UNIQUE(唯一)約束UNIQUEINDEX(唯一索引)、IDENTITYCOLUMN(標(biāo)識(shí)列)域完整性DEFAULT(默認(rèn)值)、CHECK(檢查)約束、RULE(規(guī)則)FOREIGNKEY(外鍵)約束、DATATYPE(數(shù)據(jù)類型)參照完整性FOREIGNKEY(外鍵)約束、CHECK(檢查)約束TRIGGER(觸發(fā)器)、STOREDPROCEDURE(存儲(chǔ)過程)用戶定義完整性RULE(規(guī)則)、TRIGGER(觸發(fā)器)、STOREDPROCEDURE(存儲(chǔ)過程)79.1數(shù)據(jù)完整性SQLServer2005中的數(shù)據(jù)9.1數(shù)據(jù)完整性(1)空值數(shù)據(jù)表中的列可以接受空值,也可以拒絕空值。在數(shù)據(jù)庫(kù)中,NULL是一個(gè)特殊值,表示未知值的概念。NULL不同于空字符或0。空字符是一個(gè)有效的字符,0是一個(gè)有效的數(shù)字。NULL只是表示此值未知這一概念。NULL也不同于零長(zhǎng)度字符串(空串)。如果列定義中包含NOTNULL子句,則不能為該列輸入NULL值。如果列定義中僅包含NULL關(guān)鍵字,則接受NULL值89.1數(shù)據(jù)完整性(1)空值89.1數(shù)據(jù)完整性(2)約束約束定義關(guān)于列中允許值的規(guī)則,是強(qiáng)制實(shí)施完整性的標(biāo)準(zhǔn)機(jī)制。使用約束優(yōu)先于使用DML觸發(fā)器、規(guī)則和默認(rèn)值。約束類型SQLServer2005有下列約束類型:NOTNULL約束:非空約束,指定列不接受NULL值.CHECK約束:檢查約束,通過限制可輸入到列中的值來強(qiáng)制實(shí)施域完整性。UNIQUE約束:唯一約束,強(qiáng)制實(shí)施列取值集合中值的唯一性。主鍵強(qiáng)制實(shí)施唯一性,但主鍵不允許NULL作為一個(gè)唯一值。99.1數(shù)據(jù)完整性(2)約束99.1數(shù)據(jù)完整性d.PRIMARYKEY約束:主鍵約束,標(biāo)識(shí)具有唯一標(biāo)識(shí)表中行的值的列或列集。e.FOREIGNKEY約束:外鍵約束,標(biāo)識(shí)并強(qiáng)制實(shí)施表之間的關(guān)系。列約束和表約束列約束指定為列定義的一部分,并且只應(yīng)用于該列。表約束的聲明與列定義無關(guān),可以應(yīng)用于表中多個(gè)列。當(dāng)一個(gè)約束中必須包含多個(gè)列時(shí),應(yīng)使用表約束。109.1數(shù)據(jù)完整性d.PRIMARYKEY約束:主鍵約9.1數(shù)據(jù)完整性(3)規(guī)則規(guī)則用于執(zhí)行一些與CHECK約束相同的功能。使用CHECK約束是限制列值的首選標(biāo)準(zhǔn)方法。CHECK約束還比規(guī)則更簡(jiǎn)明。一個(gè)列只能應(yīng)用一個(gè)規(guī)則,但可以應(yīng)用多個(gè)CHECK約束。CHECK約束被指定為CREATETABLE語句的一部分,而規(guī)則是作為單獨(dú)的對(duì)象創(chuàng)建,然后綁定到列上。119.1數(shù)據(jù)完整性(3)規(guī)則119.1數(shù)據(jù)完整性(4)默認(rèn)值如果插入行時(shí)沒有為列指定值,默認(rèn)值則指定列中默認(rèn)取值。默認(rèn)值可以是計(jì)算結(jié)果為常量的任何值,例如常量、內(nèi)置函數(shù)或數(shù)學(xué)表達(dá)式。若要應(yīng)用默認(rèn)值,可以通過在CREATETABLE中使用DEFAULT關(guān)鍵字來創(chuàng)建默認(rèn)值定義。這將為每一列分配一個(gè)常量表達(dá)式作為默認(rèn)值,也可以作為單獨(dú)的對(duì)象創(chuàng)建,然后綁定到列上。129.1數(shù)據(jù)完整性(4)默認(rèn)值129.2約束約束是通過限制字段中數(shù)據(jù)、記錄中數(shù)據(jù)和表之間的數(shù)據(jù)來保證數(shù)據(jù)完整性。約束獨(dú)立于表結(jié)構(gòu),創(chuàng)建約束有兩種方法:創(chuàng)建表時(shí)在CREATETABLE命令中聲明;在不改變表結(jié)構(gòu)的基礎(chǔ)上,通過修改表結(jié)構(gòu)命令A(yù)LTERTABLE添加或刪除。當(dāng)表被刪除時(shí),表所帶的所有約束定義也隨之被刪除。139.2約束139.2約束表9.2所有可用的約束類型完整性類型約束類型域完整性DEFAULT(默認(rèn)值)、CHECK(檢查)約束實(shí)體完整性PRIMARYKEY(主鍵)約束、UNIQUE(唯一)約束參照完整性FOREIGNKEY(外鍵)約束149.2約束表9.2所有可用的約束類型完整性類型約束9.2約束主鍵約束在數(shù)據(jù)表中經(jīng)常有一列或多列的組合,其值能唯一地標(biāo)識(shí)表中的每一行。這樣的一列或多列稱為表的主鍵。通過它可強(qiáng)制表的實(shí)體完整性,以確保數(shù)據(jù)表中數(shù)據(jù)的唯一性。當(dāng)創(chuàng)建或更改表時(shí),可通過定義PRIMARYKEY(主鍵)約束來創(chuàng)建主鍵。159.2約束主鍵約束159.2約束對(duì)于主鍵約束,需滿足以下規(guī)則。一個(gè)表只能包含一個(gè)PRIMARYKEY約束。由PRIMARYKEY約束生成的索引不會(huì)使表中的非聚集索引超過249個(gè),聚集索引超過1個(gè)。如果沒有為PRIMARYKEY約束指定CLUSTERED或NONCLUSTERED,并且沒有為UNIQUE約束指定聚集索引,則將對(duì)該P(yáng)RIMARYKEY約束使用CLUSTERED。在PRIMARYKEY約束中定義的所有列都必須定義為NOTNULL。如果沒有指定為空性,則加入PRIMARYKEY約束的所有列的為空性都將設(shè)置為NOTNULL。169.2約束對(duì)于主鍵約束,需滿足以下規(guī)則。169.2約束(1)創(chuàng)建表時(shí)聲明主鍵約束如果表的主鍵由單列組成,則該主鍵約束可以定義為該列的列約束。如果主鍵由兩個(gè)以上的列組成,則該主鍵約束必須定義為表約束。①定義列級(jí)主鍵約束語法格式如下:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]179.2約束(1)創(chuàng)建表時(shí)聲明主鍵約束179.2約束CONSTRAINT:可選關(guān)鍵字,表示PRIMARYKEY、NOTNULL、UNIQUE、FOREIGNKEY或CHECK約束定義的開始。constraint_name:約束的名稱。約束名稱必須在表所屬的架構(gòu)中唯一。PRIMARYKEY:是通過唯一索引對(duì)給定的一列或多列強(qiáng)制實(shí)體完整性的約束。每個(gè)表只能創(chuàng)建一個(gè)PRIMARYKEY約束。CLUSTERED|NONCLUSTERED:指示為PRIMARYKEY約束創(chuàng)建聚集索引還是非聚集索引。PRIMARYKEY約束默認(rèn)為CLUSTERED。189.2約束CONSTRAINT:可選關(guān)鍵字,表示PRI9.2約束②定義表級(jí)主鍵約束語法格式如下。[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED](column_name[,...n])其中,column_name[,...n]指定組成主鍵的列名,n最大值為16。199.2約束②定義表級(jí)主鍵約束199.2約束(2)修改表時(shí)創(chuàng)建主鍵約束語法格式如下。ALTERTABLEtable_nameADDCONSTRAINTConstraint_namePRIMARYKEY[CLUSTERED|NONCLUSTERED](column_name[,…n])
209.2約束(2)修改表時(shí)創(chuàng)建主鍵約束209.2約束例如:假設(shè)在teaching數(shù)據(jù)庫(kù)中的s_c表中沒有設(shè)置主鍵約束,以下示例通過ALTERTABLE命令添加主鍵約束。USEteachingGOALTERTABLEs_cADDCONSTRAINTPK_scPRIMARYKEY(SNO,CNO)GO通過ALTERTABLE命令也可以刪除不使用的主鍵約束,命令格式如下。ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name219.2約束例如:假設(shè)在teaching數(shù)據(jù)庫(kù)中的s_c表9.2約束外鍵約束通過將用于保存表中主鍵值的一列或多列添加到另一個(gè)表中,可創(chuàng)建兩個(gè)表之間的鏈接。這個(gè)列就成為第二個(gè)表的外鍵。外鍵用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間的鏈接的一列或多列。當(dāng)創(chuàng)建或更改表時(shí),可以通過定義FOREIGNKEY約束來創(chuàng)建外鍵。229.2約束外鍵約束229.2約束對(duì)于外鍵約束,需要滿足以下規(guī)則。如果在FOREIGNKEY約束的列中輸入非NULL值,則此值必須在被引用列中存在;否則,將返回違反外鍵約束的錯(cuò)誤信息。FOREIGNKEY約束僅能引用位于同一服務(wù)器上的同一數(shù)據(jù)庫(kù)中的表??鐢?shù)據(jù)庫(kù)的參照完整性必須通過觸發(fā)器實(shí)現(xiàn)。FOREIGNKEY約束可引用同一表中的其他列,此行為稱為自引用。列級(jí)FOREIGNKEY約束的REFERENCES子句只能列出一個(gè)引用列。此列的數(shù)據(jù)類型必須與定義約束的列的數(shù)據(jù)類型相同。表級(jí)FOREIGNKEY約束的REFERENCES子句中引用列的數(shù)目必須與約束列列表中的列數(shù)相同。每個(gè)引用列的數(shù)據(jù)類型也必須與列表中相應(yīng)列的數(shù)據(jù)類型相同。FOREIGNKEY約束只能引用所參照的表的PRIMARYKEY或UNIQUE約束中的列或所引用的表上UNIQUEINDEX中的列。239.2約束對(duì)于外鍵約束,需要滿足以下規(guī)則。239.2約束(1)創(chuàng)建表時(shí)聲明外鍵約束語法格式如下。[CONSTRAINTconstraint_name]FOREIGNKEYREFERENCES[schema_name.]referenced_table_name[(ref_column)][ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}][ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}]249.2約束(1)創(chuàng)建表時(shí)聲明外鍵約束249.2約束FOREIGNKEYREFERENCES:為列中的數(shù)據(jù)提供參照完整性的約束。FOREIGNKEY約束要求列中的每個(gè)值在所引參照的表中對(duì)應(yīng)的被引用列中都存在。[schema_name.]referenced_table_name:是FOREIGNKEY約束參照的表的名稱,以及該表所屬架構(gòu)的名稱。(ref_column[,...n]):是FOREIGNKEY約束所引用的表中的一列或多列。ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}:指定如果已創(chuàng)建表中的行具有引用關(guān)系,并且被引用行已從父表中刪除,則對(duì)這些行采取的操作。默認(rèn)值為NOACTION。259.2約束FOREIGNKEYREFERENCES9.2約束NOACTION:數(shù)據(jù)庫(kù)引擎將引發(fā)錯(cuò)誤,并回滾對(duì)父表中相應(yīng)行的刪除操作。CASCADE:如果從父表中刪除一行,則將從引用表中刪除相應(yīng)行。SETNULL:如果父表中對(duì)應(yīng)的行被刪除,則組成外鍵的所有值都將設(shè)置為NULL。若要執(zhí)行此約束,外鍵列必須可為空值。SETDEFAULT:如果父表中對(duì)應(yīng)的行被刪除,則組成外鍵的所有值都將設(shè)置為默認(rèn)值。若要執(zhí)行此約束,所有外鍵列都必須有默認(rèn)定義。如果某列為空值,并且未設(shè)置顯式的默認(rèn)值,則將使用NULL作為該列的隱式默認(rèn)值。269.2約束NOACTION:數(shù)據(jù)庫(kù)引擎將引發(fā)錯(cuò)誤,并回9.2約束ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}:指定在發(fā)生更改的表中,如果行有引用關(guān)系且引用的行在父表中被更新,則對(duì)這些行采取什么操作。默認(rèn)值為NOACTION。279.2約束ONUPDATE{NOACTION9.2約束外鍵約束不僅可以與一張表上的主鍵約束建立聯(lián)系,也可以與另一張表上的UNIQUE約束建立聯(lián)系。當(dāng)一行新的數(shù)據(jù)被加入到表格中,或表格中已經(jīng)存在的外鍵上的數(shù)據(jù)進(jìn)行修改時(shí),新的數(shù)據(jù)必須存在于另一張表的主鍵上,或者為NULL。在外鍵約束上允許存在為NULL的值。當(dāng)主鍵所在表的數(shù)據(jù)被另一張表的外鍵所引用時(shí),用戶將無法對(duì)主鍵里的數(shù)據(jù)進(jìn)行修改或刪除,除非事先刪除或修改引用的數(shù)據(jù)。289.2約束外鍵約束不僅可以與一張表上的主鍵約束建立聯(lián)系,9.2約束(2)修改表時(shí)創(chuàng)建外鍵約束語法格式如下。ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameFOREIGNKEY(column[,…n])REFERENCESref_table(ref_column[,…n])299.2約束(2)修改表時(shí)創(chuàng)建外鍵約束299.2約束例如:假設(shè)在teaching數(shù)據(jù)庫(kù)中的s_c表中沒有設(shè)置外鍵約束,以下示例通過ALTERTABLE命令添加外鍵約束。USEteachingGOALTERTABLEs_cADDCONSTRAINTFK_sc_snoFOREIGNKEY(SNO)REFERENCESstudent(SNO)GOALTERTABLEs_cADDCONSTRAINTFK_sc_cnoFOREIGNKEY(CNO)REFERENCEScourse(CNO)GO 通過ALTERTABLE命令也可以刪除不使用的外鍵約束,命令格式如下。ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name[,…n]309.2約束例如:假設(shè)在teaching數(shù)據(jù)庫(kù)中的s_c表9.2約束UNIQUE(唯一)約束對(duì)于數(shù)據(jù)表中非主鍵列的指定列,唯一約束確保不會(huì)輸入重復(fù)的值。每個(gè)UNIQUE約束建立一個(gè)唯一索引。每個(gè)表中只能有一個(gè)主鍵,但是可以有多個(gè)UNIQUE列。唯一約束指定的列可以有NULL值。表中的主鍵也強(qiáng)制執(zhí)行唯一性,但主鍵不允許為NULL,主鍵約束強(qiáng)度大于唯一約束。唯一約束需滿足以下規(guī)則。如果沒有為UNIQUE約束指定CLUSTERED或NONCLUSTERED,則默認(rèn)使用NONCLUSTERED。每個(gè)UNIQUE約束都生成一個(gè)索引。UNIQUE約束的數(shù)目不會(huì)使表中的非聚集索引超過249個(gè),聚集索引超過1個(gè)。319.2約束UNIQUE(唯一)約束319.2約束(1)創(chuàng)建表時(shí)聲明唯一約束如果表的唯一約束由單列組成,則該唯一約束可以定義為該列的列約束。如果唯一約束由兩個(gè)以上的列組成,則該唯一約束必須定義為表約束。①定義列級(jí)主鍵約束語法格式如下。[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED]UNIQUE:唯一約束。CLUSTERED|NONCLUSTERED:指示為UNIQUE約束創(chuàng)建聚集索引還是非聚集索引。329.2約束(1)創(chuàng)建表時(shí)聲明唯一約束329.2約束②定義表級(jí)唯一約束語法格式如下。[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED](column_name[,...n])
(2)修改表時(shí)創(chuàng)建唯一約束語法格式如下。ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameUNIQUE(column[,…n])339.2約束②定義表級(jí)唯一約束339.2約束例如:以下示例將teaching數(shù)據(jù)庫(kù)中的student表中的姓名列設(shè)置為唯一約束。USEteachingGOALTERTABLEstudentADDCONSTRAINTUQ_studentUNIQUE(SNAME)通過ALTERTABLE命令也可以刪除不使用的唯一約束,命令格式如下。ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name[,…n]349.2約束例如:以下示例將teaching數(shù)據(jù)庫(kù)中的st9.2約束檢查約束檢查(CHECK)約束通過檢查輸入表列的數(shù)據(jù)的值來維護(hù)值域的完整性,它可用來指定某列可取值的清單或可取值的集合,也可指定某列可取值的范圍。可以在一列上設(shè)置多個(gè)檢查約束,也可以將一個(gè)檢查約束應(yīng)用于多列。當(dāng)一列受多個(gè)檢查約束控制時(shí),所有的約束按照創(chuàng)建的順序,依次進(jìn)行數(shù)據(jù)有效性的檢查。根據(jù)檢查約束是作用于單列還是多列,可分為列級(jí)檢查約束和表級(jí)檢查約束。359.2約束檢查約束359.2約束對(duì)于檢查約束,需滿足以下規(guī)則。列可以有任意多個(gè)CHECK約束,并且約束條件中可以包含用AND和OR組合起來的多個(gè)邏輯表達(dá)式。列上的多個(gè)CHECK約束按創(chuàng)建順序進(jìn)行驗(yàn)證。搜索條件必須取值為布爾表達(dá)式,并且不能引用其他表。列級(jí)CHECK約束只能引用被約束的列,表級(jí)CHECK約束只能引用同一表中的列。當(dāng)執(zhí)行INSERT和DELETE語句時(shí),CHECK約束和規(guī)則具有相同的數(shù)據(jù)驗(yàn)證功能。當(dāng)列上存在規(guī)則和一個(gè)或多個(gè)CHECK約束時(shí),將驗(yàn)證所有限制。不能在text、ntext或image列上定義CHECK約束。369.2約束對(duì)于檢查約束,需滿足以下規(guī)則。369.2約束(1)創(chuàng)建表時(shí)聲明唯一約束語法格式如下。[CONSTRAINTconstraint_name]CHECK(logical_expression)各選項(xiàng)含義如下:CHECK:檢查約束。該約束通過限制可輸入一列或多列中的可能值來強(qiáng)制實(shí)現(xiàn)域完整性。logical_expression:返回TRUE或FALSE的邏輯表達(dá)式。別名數(shù)據(jù)類型不能作為表達(dá)式的一部分。379.2約束(1)創(chuàng)建表時(shí)聲明唯一約束379.2約束(2)修改表時(shí)創(chuàng)建檢查約束語法格式如下。ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameCHECK(logical_expression)389.2約束(2)修改表時(shí)創(chuàng)建檢查約束389.2約束例如:假設(shè)在teaching數(shù)據(jù)庫(kù)中的s_c表中沒有設(shè)置對(duì)成績(jī)列的檢查約束,以下示例通過ALTERTABLE命令添加檢查約束。USEteachingGOALTERTABLEs_cADDCONSTRAINTCK_scCHECK(GRADE>=0ANDGRADE<=100)GO通過ALTERTABLE命令也可以刪除不使用的檢查約束,命令格式如下。ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name[,…n]399.2約束例如:假設(shè)在teaching數(shù)據(jù)庫(kù)中的s_c表9.2約束默認(rèn)約束DEFAULT(默認(rèn))約束能夠定義一個(gè)值,每當(dāng)用戶沒有在某一列中輸入值時(shí),則將所定義的值提供給這一列。默認(rèn)約束需滿足以下規(guī)則。一個(gè)表中只能有一列定義有DEFAULT(默認(rèn))約束。不能在數(shù)據(jù)類型為timestamp的列或具有IDENTITY屬性的列中定義DEFAULT(默認(rèn))約束。409.2約束默認(rèn)約束409.2約束(1)創(chuàng)建表時(shí)聲明主鍵約束①建表時(shí)創(chuàng)建DEFAULT(默認(rèn))約束語法格式如下。[CONSTRAINTconstraint_name]DEFAULTconstant_expression各選項(xiàng)含義如下:DEFAULT:如果在插入過程中未顯式提供值,則指定為列提供的值。constant_expression:是用作列的默認(rèn)值的常量、NULL或系統(tǒng)函數(shù)。419.2約束(1)創(chuàng)建表時(shí)聲明主鍵約束419.2約束(2)修改表時(shí)創(chuàng)建默認(rèn)約束語法格式如下。ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameDEFAULTconstant_expressionFORcolumn_name例如:以下示例為teaching數(shù)據(jù)庫(kù)中的s_c表中的成績(jī)列設(shè)置默認(rèn)約束。USEteachingGOALTERTABLEs_cADDCONSTRAINTDF_gradeDEFAULT0FORGRADEGO通過ALTERTABLE命令也可以刪除不使用的默認(rèn)約束,命令格式如下。ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name[,…n]429.2約束(2)修改表時(shí)創(chuàng)建默認(rèn)約束429.3規(guī)則規(guī)則是一個(gè)數(shù)據(jù)庫(kù)對(duì)象,當(dāng)把它綁定到列或用戶定義的數(shù)據(jù)類型時(shí),用來指定列可以接受哪些數(shù)據(jù),使用這種方式可以提供與CHECK約束相同的功能。CHECK約束是用來限制列值的首選標(biāo)準(zhǔn)方法。規(guī)則與CHECK約束相比較,CHECK約束比規(guī)則更簡(jiǎn)明(因?yàn)镃HECK約束被創(chuàng)建之后可以直接使用,而規(guī)則在創(chuàng)建之后必須綁定到指定的列上才能夠使用)。439.3規(guī)則439.3規(guī)則
創(chuàng)建規(guī)則語法格式如下。CREATERULErule_nameAScondition_expression各選項(xiàng)含義如下:rule_name:新規(guī)則的名稱。規(guī)則名稱必須符合標(biāo)識(shí)符規(guī)則。根據(jù)需要,指定規(guī)則所有者名稱。condition_expression:定義規(guī)則的條件。condition_expression包含一個(gè)變量。每個(gè)局部變量的前面都有一個(gè)@符號(hào)。該表達(dá)式引用通過UPDATE或INSERT語句輸入的值。在創(chuàng)建規(guī)則時(shí),可以使用任何名稱或符號(hào)表示值,但第一個(gè)字符必須是@符號(hào)。449.3規(guī)則創(chuàng)建規(guī)則449.3規(guī)則例如:以下示例在teaching數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)規(guī)則grade_rule,規(guī)則的條件是只能輸入一個(gè)0~100之間的數(shù)字。USEteachingGOCREATERULEgrade_ruleAS@Grade>=0and@Grade<=100GO459.3規(guī)則例如:以下示例在teaching數(shù)據(jù)庫(kù)中創(chuàng)建一9.3規(guī)則查看規(guī)則可以使用系統(tǒng)存儲(chǔ)過程sp_helptext查看已經(jīng)創(chuàng)建的規(guī)則,語法格式如下。sp_helptext[@objname=]'object_name‘其中:[@objname=]‘object_name’:指定對(duì)象的名稱。例如:以下示例查看已經(jīng)創(chuàng)建的規(guī)則grade_rule。USEteachingGOEXECsp_helptextgrade_ruleGO執(zhí)行結(jié)果如圖9.1所示。469.3規(guī)則查看規(guī)則469.3規(guī)則綁定與解除規(guī)則
1.綁定規(guī)則創(chuàng)建好一個(gè)規(guī)則后,必須通過綁定才能使用規(guī)則,一般情況下,規(guī)則可以綁定在用戶自定義數(shù)據(jù)類型或是數(shù)據(jù)列中。綁定規(guī)則可以使用存儲(chǔ)過程sp_bindrule,語法格式如下:sp_bindrule[@rulename=]'rule',[@objname=]'object_name‘[@rulename=]‘rule’:指定規(guī)則名稱。[@objname=]‘object_name’:指定規(guī)則綁定的對(duì)象。479.3規(guī)則綁定與解除規(guī)則479.3規(guī)則如果規(guī)則綁定的對(duì)象是表的列,則object_name的格式是table.column,否則認(rèn)為是用戶定義數(shù)據(jù)類型。例如:以下示例將例9.7創(chuàng)建的規(guī)則grade_rule綁定到teaching數(shù)據(jù)庫(kù)中的s_c表中的GRADE列上。USEteachingGOEXECsp_bindrule'grade_rule','s_c.GRADE'GO489.3規(guī)則如果規(guī)則綁定的對(duì)象是表的列,則object_n9.3規(guī)則2.解除規(guī)則系統(tǒng)存儲(chǔ)過程sp_unbindrule用于當(dāng)前數(shù)據(jù)庫(kù)中為列或用戶定義數(shù)據(jù)類型解除規(guī)則綁定。語法格式如下。sp_unbindrule[@objname=]'object_name‘例如:解除綁定在teaching數(shù)據(jù)庫(kù)中的s_c表中GRADE列上的規(guī)則。USEteachingGOEXECsp_unbindrule's_c.GRADE'GO499.3規(guī)則2.解除規(guī)則499.3規(guī)則
刪除規(guī)則從數(shù)據(jù)庫(kù)中刪除一個(gè)規(guī)則值時(shí),可以分為以下兩種情況來處理。如果這個(gè)規(guī)則尚未綁定到表或用戶定義數(shù)據(jù)類型上,可以使用DROPRULE語句來刪除。如果已經(jīng)將這個(gè)規(guī)則綁定到表或用戶定義數(shù)據(jù)類型上,必須首先使用系統(tǒng)存儲(chǔ)過程sp_unbindrule來解除該規(guī)則在表列或用戶定義數(shù)據(jù)類型上的綁定,然后使用DROPRULE語句刪除該規(guī)則。509.3規(guī)則刪除規(guī)則509.3規(guī)則可以使用Transact-SQL命令的DROPRULE語句從數(shù)據(jù)庫(kù)刪除一個(gè)或多個(gè)規(guī)則。其語法格式如下。DROPRULErule_name[,…n]
例如:刪除teaching數(shù)據(jù)庫(kù)中的規(guī)則grade_rule。USEteachingGODROPRULEgrade_ruleGO519.3規(guī)則可以使用Transact-SQL命令的DROP9.4默認(rèn)值默認(rèn)值就是當(dāng)用戶未指定時(shí)由SQLServer自動(dòng)指派的數(shù)據(jù)值,它可以是常量、內(nèi)置函數(shù)或表達(dá)式。使用默認(rèn)值有兩種方式:在CREATETABLE語句中對(duì)列定義一個(gè)DEFAULT約束使用CREATEDEFAULT語句在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)默認(rèn)值對(duì)象,然后使用sp_binddefault系統(tǒng)存儲(chǔ)過程將該對(duì)象綁定到表列上。529.4默認(rèn)值默認(rèn)值就是當(dāng)用戶未指定時(shí)由SQLServe9.4默認(rèn)值創(chuàng)建默認(rèn)值1.創(chuàng)建默認(rèn)值對(duì)象可以使用Transact-SQL命令CREATEDEFAULT語句來完成。語法格式如下。CREATEDEFAULTdefault_nameASconstant_expression其中:constant_expression可以是常量表達(dá)式、任何常量、內(nèi)置函數(shù)或數(shù)學(xué)表達(dá)式,但不能包含任何列或其他數(shù)據(jù)庫(kù)對(duì)象的名稱。539.4默認(rèn)值創(chuàng)建默認(rèn)值539.4默認(rèn)值例如:在teaching數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為grade_default的默認(rèn)值,并以0作為其值。USEteachingGOCREATEDEFAULTgrade_defaultAS0GO549.4默認(rèn)值例如:在teaching數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為9.4默認(rèn)值2.可以使用系統(tǒng)存儲(chǔ)過程sp_helptext查看默認(rèn)值定義,語法格式如下。sp_helptext[@objname=]'name‘name為用戶定義的對(duì)象名稱。僅當(dāng)指定限定對(duì)象時(shí)才需要引號(hào)。對(duì)象必須在當(dāng)前數(shù)據(jù)庫(kù)中。例如:查看已經(jīng)創(chuàng)建的默認(rèn)值grade_default。USEteachingGOEXECsp_helptextgrade_defaultGO執(zhí)行結(jié)果如圖9.2所示559.4默認(rèn)值2.可以使用系統(tǒng)存儲(chǔ)過程sp_helpte9.4默認(rèn)值綁定與解除默認(rèn)值
1.綁定默認(rèn)值在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)默認(rèn)值后,還必須把該默認(rèn)值綁定到列或用戶定義數(shù)據(jù)類型上才能讓它發(fā)揮作用。可以用系統(tǒng)存儲(chǔ)過程sp_binddefault來完成
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 瑩石干粉行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 2025年度商鋪轉(zhuǎn)租合同電子版編輯與租賃合同違約責(zé)任
- 2020-2025年中國(guó)天然氣公交行業(yè)市場(chǎng)深度分析及行業(yè)發(fā)展趨勢(shì)報(bào)告
- 2024年查詢塔城地區(qū)社會(huì)招聘事業(yè)單位工作人員筆試真題
- 2025年度金融資產(chǎn)托管與銀行受托支付合同
- 2025年度房屋抵押貸款轉(zhuǎn)讓合同協(xié)議書
- 2025年中國(guó)縫紉機(jī)械行業(yè)市場(chǎng)調(diào)查研究及投資潛力預(yù)測(cè)報(bào)告
- 2025年度地下停車場(chǎng)車位轉(zhuǎn)讓及增值服務(wù)綜合合同
- 修模師傅合同范本
- 2025年度土地托管與農(nóng)業(yè)廢棄物資源化利用合作協(xié)議
- 《中華人民共和國(guó)學(xué)前教育法》專題培訓(xùn)
- 揭陽(yáng)市基層診所醫(yī)療機(jī)構(gòu)衛(wèi)生院社區(qū)衛(wèi)生服務(wù)中心村衛(wèi)生室地址信息
- 通信工程監(jiān)理方案
- 主題閱讀25:陜北的春
- 晉中項(xiàng)目投決會(huì)報(bào)告
- 2022年中小學(xué)心理健康教育指導(dǎo)綱要
- 公共關(guān)系文書(《公共關(guān)系學(xué)》課件)
- 2023屆高考復(fù)習(xí)之文學(xué)類文本閱讀訓(xùn)練
- 國(guó)家基礎(chǔ)教育實(shí)驗(yàn)中心外語教育研究中心
- 義務(wù)教育(道德與法治)新課程標(biāo)準(zhǔn)(2022年修訂版)
- 100以內(nèi)不進(jìn)位不退位加減法練習(xí)習(xí)題(直接打印)
評(píng)論
0/150
提交評(píng)論