零點(diǎn)起飛學(xué)oracle第11章使用約束_第1頁(yè)
零點(diǎn)起飛學(xué)oracle第11章使用約束_第2頁(yè)
零點(diǎn)起飛學(xué)oracle第11章使用約束_第3頁(yè)
零點(diǎn)起飛學(xué)oracle第11章使用約束_第4頁(yè)
零點(diǎn)起飛學(xué)oracle第11章使用約束_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第11章使用約束約束是用來(lái)束縛表中的數(shù)據(jù)的,使表中的數(shù)據(jù)滿足某種條件。我們可以通過(guò)約束保證數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性和可靠性。Oracle的主要約束包括主鍵約束、外鍵約束、唯一性約束、檢查約束、默認(rèn)值約束、非空約束。本章主要學(xué)習(xí)Oracle中約束的創(chuàng)建,并深入理解這些約束的使用。11.1使用主鍵約束主鍵約束用來(lái)標(biāo)識(shí)表中一個(gè)列,一個(gè)表中的主鍵約束只有一個(gè),但是可以在一個(gè)主鍵約束中包含多個(gè)列,也成為聯(lián)合主鍵。本節(jié)將著重講述主鍵的創(chuàng)建、使用及相關(guān)操作。11.1.1為什么要使用主鍵主鍵約束是Oracle數(shù)據(jù)庫(kù)的最常用約束,也是數(shù)據(jù)庫(kù)設(shè)計(jì)者最需要注意的約束。主鍵可以像普通數(shù)據(jù)庫(kù)對(duì)象那樣進(jìn)行創(chuàng)建、修改、刪除等操作。在數(shù)據(jù)表設(shè)計(jì)時(shí),數(shù)據(jù)表一般要求滿足BCNF范式。這要求數(shù)據(jù)表至少含有一個(gè)候選碼(可看作唯一性約束)。而其中一個(gè)候選碼又被選為主碼。這里的主碼,可以看做數(shù)據(jù)表的主鍵。除了數(shù)據(jù)表設(shè)計(jì)的一般規(guī)則之外,主鍵的出現(xiàn)還有以下現(xiàn)實(shí)意義。1.實(shí)現(xiàn)記錄的唯一性——實(shí)體完整性2.檢索有利3.支持外鍵11.1.2什么是主鍵主鍵用來(lái)唯一地標(biāo)識(shí)表中的一行數(shù)據(jù),它規(guī)定在主鍵列上的數(shù)據(jù)不能重復(fù),并且不能為空。如果在某個(gè)列上指定了主鍵約束,那么就不需要在該列上再指定notnull約束和unique約束。創(chuàng)建主鍵時(shí),有以下注意事項(xiàng)。主鍵列的數(shù)據(jù)類型:我們?cè)O(shè)置主鍵時(shí),主鍵列的數(shù)據(jù)類型不一定是數(shù)值型,也可以使其他的,如字符型。主鍵不一定只有一列:在表的設(shè)計(jì)視圖中,選擇可以要定義為主鍵的一個(gè)或多個(gè)字段。自增的數(shù)值型主鍵:設(shè)置主鍵時(shí),可以采用自增的列作為主鍵,實(shí)現(xiàn)自動(dòng)編號(hào),速度快,對(duì)于檢索非常有利。11.1.3創(chuàng)建主鍵約束主鍵約束在每一個(gè)數(shù)據(jù)表中只有一個(gè)。創(chuàng)建主鍵約束可以在創(chuàng)建表時(shí)與表的列描述同時(shí)進(jìn)行,也可以在表創(chuàng)建成功之后,手動(dòng)進(jìn)行添加。1.創(chuàng)建表的同時(shí),定義主鍵約束我們?cè)趧?chuàng)建表時(shí)定義主鍵約束。對(duì)于單列主鍵來(lái)說(shuō),可以在列的描述之后使用primarykey關(guān)鍵字將該列指定為主鍵列。其語(yǔ)法形式如下所示。createtable表名(列名1數(shù)據(jù)類型1

primarykey,列名2數(shù)據(jù)類型2,列名3數(shù)據(jù)類型......)其中,關(guān)鍵字primarykey緊跟在列1的描述之后,那么列1將作為數(shù)據(jù)表的主鍵列。該表也將擁有一個(gè)主鍵約束。11.1.3創(chuàng)建主鍵約束【示例11-1】重新創(chuàng)建表employeenew,并為表建立主鍵,主鍵列為employee_id。【示例11-2】對(duì)于單列主鍵,可以在列的描述中定義主鍵。但是對(duì)于多列主鍵,則必須將主鍵描述與列的描述并列進(jìn)行。例如,在表employeenew中,希望將employee_id、last_name兩列作為主鍵。11.1.3創(chuàng)建主鍵約束2.創(chuàng)建表后,添加主鍵約束在示例11-1和示例11-2中,我們總是將表首先刪除,然后再重新創(chuàng)建數(shù)據(jù)表,并在重建過(guò)程中創(chuàng)建主鍵約束。此外,我們還可以不刪除表,為已存在的表添加主鍵約束。此時(shí)可以利用altertable命令。利用altertable命令為表添加主鍵的語(yǔ)法形式如下所示。altertable表名add

primarykey(列名1,列名2…)其中,altertable命令用于修改表的屬性;primarykey(列名1,列名2…)則指定主鍵被建立在哪些列之上,各列名之間使用逗號(hào)進(jìn)行分隔?!臼纠?1-4】例如,為表employeenew添加主鍵。11.1.3創(chuàng)建主鍵約束3.為主鍵命名主鍵是約束的一種,可以利用為表添加約束的方式來(lái)顯式命名約束,從而實(shí)現(xiàn)命名主鍵。其語(yǔ)法形式如下所示。altertable表名add

constraint約束名稱primarykey(列名1,列名2…)其中,altertable命令用于修改表的屬性;addconstraint用于為表添加約束,并指定約束名稱;primarykey(列名1,列名2…)指定約束的詳細(xì)定義?!臼纠?1-5】在SQLDeveploper中創(chuàng)建主鍵約束,并為約束顯式命名。11.1.3創(chuàng)建主鍵約束4.測(cè)試主鍵的作用當(dāng)在一個(gè)表上創(chuàng)建主鍵之后,向表中添加數(shù)據(jù)就有了約束。此時(shí),輸入數(shù)據(jù)時(shí)表中所有數(shù)據(jù)在主鍵列上的值(或值的組合)不能重復(fù),并且主鍵列上的值不能為空?!臼纠?1-6】嘗試向表employeenew中插入已存在的id的記錄,Oracle將拋出錯(cuò)誤提示,并禁止用戶的插入操作。【示例11-7】除不能向表employeenew中插入employee_id沖突的數(shù)據(jù)之外,同樣不能插入iemployee_id為空的數(shù)據(jù)。11.1.3創(chuàng)建主鍵約束【示例11-8】單列主鍵約束要求主鍵列值不能重復(fù),而聯(lián)合主鍵要求主鍵列值的組合不能重復(fù)。例如,可以將表employeenew的主鍵修改為列employee_id與列l(wèi)ast_name的聯(lián)合主鍵,并測(cè)試主鍵的作用?!臼纠?1-9】對(duì)于聯(lián)合主鍵中的任意一列,其值均不可為空。例如,嘗試向表employeenew中插入employee_id為空的數(shù)據(jù),Oracle同樣會(huì)拋出錯(cuò)誤。11.1.4修改主鍵約束主鍵約束創(chuàng)建之后,可以對(duì)其進(jìn)行屬性修改。修改主鍵約束主要包括兩方面的內(nèi)容:禁用/啟用主鍵和重命名主鍵。1.禁用/啟用主鍵在Oracle中,對(duì)于任何已經(jīng)創(chuàng)建好的約束,可以使用ENABLE或者是DISABLE來(lái)啟用約束或者是禁用約束。禁用的約束好像并沒(méi)有創(chuàng)建約束一樣,并沒(méi)有達(dá)到創(chuàng)建約束的目的,但是通過(guò)ENABLE子句,可以隨時(shí)啟用約束。禁用/啟用數(shù)據(jù)表主鍵的語(yǔ)法如下所示。altertable表名disableprimarykey其中,disalbe

primarykey用于禁用數(shù)據(jù)表主鍵,因?yàn)閿?shù)據(jù)表的主鍵的唯一性,因此,無(wú)需指定主鍵名稱。11.1.4修改主鍵約束【示例11-10】表employeenew的主鍵pk_employeenew的當(dāng)前狀態(tài)為可用,那么不允許插入employee_id與last_name與已有記錄沖突的數(shù)據(jù)。現(xiàn)禁用該主鍵,并再次嘗試插入數(shù)據(jù)?!臼纠?1-11】當(dāng)啟用主鍵約束時(shí),Oracle仍然會(huì)檢查數(shù)據(jù)表中現(xiàn)有數(shù)據(jù)是否違反了主鍵約束。如果違反,那么主鍵的啟用也將失敗。11.1.4修改主鍵約束2.重命名主鍵如果需要修改已有主鍵的名稱,則需要使用到重命名主鍵策略。重命名主鍵的語(yǔ)法如下所示。altertable表名renameconstraint原主鍵名稱to新主鍵名稱其中,rename

constraint用于重命名約束,主鍵是約束的一種,因此,該選項(xiàng)同樣適用于重命名主鍵;to關(guān)鍵字則用于指定新的主鍵名稱?!臼纠?1-12】重命名主鍵最常用的場(chǎng)合為修改系統(tǒng)自動(dòng)生成的主鍵名稱。11.1.5主鍵與索引索引可以使用戶快速找到表中的特定信息。當(dāng)用戶在數(shù)據(jù)表的某列(或某些列)上創(chuàng)建了主鍵、而在檢索數(shù)據(jù)時(shí)又使用了該索引列,Oracle可以很快的捕獲符合條件的記錄。而不必采用全表逐條掃描的方式。有關(guān)索引的詳細(xì)信息,將在以后的章節(jié)講解。11.1.5主鍵與索引【示例11-13】在Oracle中,創(chuàng)建了主鍵之后,都會(huì)存在一個(gè)建立在主鍵列上的索引。例如,表employeenew的主鍵pk_employeenew建立在列employee_id上。我們可以通過(guò)視圖user_indexes獲得表employeenew上索引的詳細(xì)信息?!臼纠?1-14】雖然索引名稱不會(huì)隨著主鍵的重命名而重命名,但是卻會(huì)隨著主鍵的刪除而被刪除?!臼纠?1-15】當(dāng)Oracle創(chuàng)建主鍵時(shí),會(huì)首先查看主鍵列上是否已經(jīng)創(chuàng)建了索引。如果未創(chuàng)建,則自動(dòng)創(chuàng)建;如果已創(chuàng)建,Oracle直接創(chuàng)建主鍵,而不會(huì)進(jìn)行索引創(chuàng)建。已存在的索引也和主鍵沒(méi)有任何連帶關(guān)系,因此,當(dāng)刪除主鍵時(shí),不會(huì)觸發(fā)索引的任何動(dòng)作。11.1.5主鍵與索引下表總結(jié)了本節(jié)的主要內(nèi)容,并概括了主鍵的特點(diǎn)。主鍵特點(diǎn)說(shuō)明數(shù)據(jù)庫(kù)操作和相關(guān)視圖約束主鍵值約束的一種user_constraints、user_ind_columns主鍵的唯一性主鍵是主碼的體現(xiàn)刪除主鍵時(shí),無(wú)需提供主鍵名稱主鍵的值不能為空無(wú)法通過(guò)id=null的條件獲得記錄禁止向主鍵列插入空值null主鍵與唯一性約束主碼來(lái)源于碼禁止向主鍵列中插入重復(fù)數(shù)據(jù)(或組合)主鍵與索引主鍵將保證主鍵列上有索引user_indexs、user_ind_columns11.2使用外鍵約束主鍵的作用是保證數(shù)據(jù)完整性——即保證數(shù)據(jù)的唯一性。外鍵約束可以保證使用外鍵約束的列與所引用的主鍵約束的列一致。主鍵可以看做表中數(shù)據(jù)之間的區(qū)分。而外鍵約束則適用于不同的表之間的相互參照關(guān)系。11.2.1為什么要使用外鍵外鍵的主要作用是保證數(shù)據(jù)的參照完整性。最終保證數(shù)據(jù)庫(kù)的完整性。本小節(jié)將講述參照完整性的定義,并闡述外鍵定義及使用。1.參照完整性在兩個(gè)表之間,一個(gè)表中的記錄依附于另一個(gè)表的記錄而存在,稱為表之間的參照完整性。參照完整性總是存在著真實(shí)的業(yè)務(wù)背景。例如,在employeenew表中,存儲(chǔ)了每位員工的信息;在jobs表中存儲(chǔ)了員工職位信息。employeenew中的每條記錄都依附于jobs表中記錄的存在而存在,即建立了兩個(gè)表之間的參照完整性。11.2.1為什么要使用外鍵2.外鍵的必要性參照完整性的設(shè)計(jì)是必要的。當(dāng)人工輸入的employeenew表的數(shù)據(jù)信息時(shí),很難保證輸入者精確地輸入所有數(shù)據(jù)。更為嚴(yán)重的是,即使輸入錯(cuò)誤,獲取錯(cuò)誤數(shù)據(jù)的具體位置也是一件費(fèi)力的工作。在數(shù)據(jù)庫(kù)中,有規(guī)范而統(tǒng)一的解決方案——參照完整性。外鍵是實(shí)現(xiàn)參照完整性的手段,因此,在一個(gè)數(shù)據(jù)庫(kù)中,外鍵的存在是非常必要的。11.2.2什么是外鍵外鍵實(shí)際是一個(gè)引用。一個(gè)數(shù)據(jù)表有自己的主鍵,而向外部其他數(shù)據(jù)表的引用,則稱作外鍵。外鍵實(shí)際隱含了對(duì)外部引用的限制——必須獲得外部數(shù)據(jù)表的唯一記錄。11.2.3創(chuàng)建外鍵約束外鍵是約束的一種,外鍵約束創(chuàng)建后即可在數(shù)據(jù)字典中獲得相應(yīng)信息。1.創(chuàng)建外鍵約束創(chuàng)建外鍵約束的語(yǔ)法如下所示。altertable表名addconstraint約束名foreignkey(外鍵列名)

references主表(主表主鍵列)

其中,altertable用于修改從表的屬性;addconstraint用于為表添加約束;foreignkey指定約束的具體類型——外鍵;references主表(主表主鍵列)用于指定外鍵引用的另一端——主表及主表的主鍵列?!臼纠?1-16】外鍵約束必然存在主表與從表。對(duì)于employeenew表和jobs的主從關(guān)系,我們首先創(chuàng)建表employeenew和表jobs,上一節(jié)中已經(jīng)創(chuàng)建employeenew。在此處需創(chuàng)建jobs表。11.2.3創(chuàng)建外鍵約束2.查看外鍵信息同樣可以在視圖user_constraints和user_cons_columns中獲取外鍵的詳細(xì)信息。【示例11-17】在視圖user_cosntraints中獲取表employeenew的約束信息。11.2.3創(chuàng)建外鍵約束3.驗(yàn)證外鍵約束的作用當(dāng)嘗試向表employeenew中插入數(shù)據(jù),可以驗(yàn)證外鍵約束的作用?!臼纠?1-18】向表employeenew中插入新的數(shù)據(jù)?!臼纠?1-19】再次向表employeenew嘗試插入信息?!臼纠?1-20】當(dāng)然,除了插入操作之外,數(shù)據(jù)修改操作同樣會(huì)受到外鍵約束的限制。11.2.4級(jí)聯(lián)更新與級(jí)聯(lián)刪除當(dāng)需要修改主表和從表中的數(shù)據(jù)時(shí),主表的操作,將連帶影響到從表的操作,這就是級(jí)聯(lián)更新與級(jí)聯(lián)刪除問(wèn)題。所謂級(jí)聯(lián)更新,是指當(dāng)主表中的主鍵列進(jìn)行修改時(shí),子表的外鍵列也應(yīng)該進(jìn)行相應(yīng)的修改。級(jí)聯(lián)刪除是指當(dāng)主表中的記錄刪除時(shí),子表中與之相關(guān)的記錄也應(yīng)該同時(shí)刪除。外鍵約束之所以會(huì)限制父表與子表的更新,是因?yàn)閿?shù)據(jù)完整性校驗(yàn)無(wú)法通過(guò)。該校驗(yàn)有兩種類型——即時(shí)校驗(yàn)(immediate)和延遲校驗(yàn)(deferred)。默認(rèn)為即時(shí)校驗(yàn),即每執(zhí)行一條語(yǔ)句,都會(huì)進(jìn)行校驗(yàn);而延遲校驗(yàn)可以指定校驗(yàn)的時(shí)機(jī)。11.2.4級(jí)聯(lián)更新與級(jí)聯(lián)刪除1.級(jí)聯(lián)更新Oracle外鍵只有級(jí)聯(lián)刪除沒(méi)有級(jí)聯(lián)更新,但是有時(shí)候系統(tǒng)中可能需要這樣的功能,我們可以通過(guò)延遲校驗(yàn)的策略來(lái)實(shí)現(xiàn)級(jí)聯(lián)更新。延遲約束表示不會(huì)再剛進(jìn)行修改的時(shí)候進(jìn)行約束查看,只有提交的時(shí)候才會(huì)檢查。創(chuàng)建延遲校驗(yàn)的外鍵約束的語(yǔ)法如下所示。altertable表名addconstraint外鍵名稱foreignkey(外鍵列)references主表名(主表主鍵列)deferrableinitiallydeferred其中,deferrableinitiallydeferred表示新建約束使用了延遲校驗(yàn)機(jī)制?!臼纠?1-21】我們可以首先刪除表employeenew的原有外鍵約束,并重建該約束,在重建過(guò)程中指定延遲校驗(yàn)規(guī)則。11.2.4級(jí)聯(lián)更新與級(jí)聯(lián)刪除2.級(jí)聯(lián)刪除Oracle為級(jí)聯(lián)刪除提供了直接的處理方式——在創(chuàng)建外鍵時(shí)直接指定。相應(yīng)的語(yǔ)法如下所示。altertable表名addconstraint外鍵名稱foreignkey(外鍵列)references主表名(主表主鍵列)ondeletecascade其中,ondeletecascade指定外鍵采用級(jí)聯(lián)刪除機(jī)制。此處的級(jí)聯(lián)刪除是指,當(dāng)用戶刪除主表中的某條記錄時(shí),Oracle會(huì)自動(dòng)搜索并刪除從表中的相關(guān)記錄。當(dāng)然,這里的相關(guān)性是由外鍵約束的引用來(lái)提供的。【示例11-22】對(duì)于表employeenew,可以首先刪除現(xiàn)有外鍵,并為其創(chuàng)建級(jí)聯(lián)刪除外鍵。11.2.5外鍵的相關(guān)操作外鍵是約束的一種,外鍵的相關(guān)操作包括,重命名、禁用/啟用、是否校驗(yàn)已有數(shù)據(jù)的參照完整性、刪除外鍵。1.重命名重命名一個(gè)外鍵,應(yīng)該使用rename選項(xiàng)?!臼纠?1-23】將表employeenew的外鍵EM_JOBS_FK重命名為E_JOBS_FK。11.2.5外鍵的相關(guān)操作2.禁用/啟用外鍵有時(shí),用戶需要插入特殊數(shù)據(jù),此時(shí)需要禁用現(xiàn)有的外鍵約束。禁用外鍵約束是指,將外鍵約束的校驗(yàn)功能暫時(shí)關(guān)閉,如同外鍵不存在一樣,直至再次打開(kāi)。禁用外鍵應(yīng)該使用disable選項(xiàng)?!臼纠?1-24】禁用表employeenew的外鍵約束E_JOBS_FK。11.2.5外鍵的相關(guān)操作3.是否校驗(yàn)已有數(shù)據(jù)的參照完整性由于數(shù)據(jù)完整性校驗(yàn)失敗,所以導(dǎo)致無(wú)法啟用主鍵約束。此時(shí),應(yīng)該采用忽略已有數(shù)據(jù)參照完整性的策略,來(lái)啟用外鍵約束?!臼纠?1-25】忽略已有數(shù)據(jù)的參照完整性校驗(yàn),應(yīng)該使用novalidate選項(xiàng)。以無(wú)法正常啟用的外鍵E_JOBS_FK為例。11.2.5外鍵的相關(guān)操作4.刪除外鍵當(dāng)一個(gè)外鍵約束沒(méi)有存在的必要,則需要及時(shí)刪除。刪除外鍵應(yīng)該使用drop

constraint選項(xiàng)。11.2.6外鍵使用總結(jié)外鍵是建立在兩個(gè)表的參照的基礎(chǔ)上,用以描述兩個(gè)表之間的主從關(guān)系。對(duì)于外鍵約束,應(yīng)該注意以下兩點(diǎn)。1.嚴(yán)格遵守主從關(guān)系的數(shù)據(jù)表應(yīng)該使用外鍵在數(shù)據(jù)庫(kù)中,如果要求兩個(gè)表嚴(yán)格遵守主從關(guān)系,那么應(yīng)該使用外鍵約束。外鍵約束是主從關(guān)系的最佳保障方案。不要求助于應(yīng)用程序來(lái)代替這一策略。11.2.6外鍵使用總結(jié)2.不能過(guò)多使用外鍵合理使用外鍵可以有效增強(qiáng)應(yīng)用系統(tǒng)的健壯性。但是,不能過(guò)分使用外鍵。首先,使用過(guò)多的外鍵,會(huì)增加數(shù)據(jù)庫(kù)復(fù)雜度。另外,過(guò)分使用外鍵,有可能影響應(yīng)用系統(tǒng)的效率。綜上所述,使用外鍵的原則為——需要嚴(yán)格遵守主從關(guān)系的數(shù)據(jù)表應(yīng)該使用外鍵,否則,不應(yīng)使用外鍵約束。11.3使用唯一性約束在數(shù)據(jù)表中,唯一性約束是用來(lái)表示一個(gè)列中的輸入值是唯一的。這個(gè)約束與前面學(xué)習(xí)的主鍵非常相似。不同的就是唯一約束在一個(gè)表中可以有多個(gè),而主鍵約束在一個(gè)表中只能有一個(gè)。唯一性約束與主鍵約束一樣,也是建立在一個(gè)或多個(gè)列之上,從而實(shí)現(xiàn)數(shù)據(jù)在該列或者列組合上的唯一性。11.3.1為什么要使用唯一性約束使用唯一性約束可以保證在非主鍵列中不輸入重復(fù)值,對(duì)于唯一性約束中的列,表中不允許有兩行包含相同的非空值。11.3.2什么是唯一性約束唯一性約束和主鍵有一定的相似性。同時(shí)也是主鍵約束的有益補(bǔ)充。本小節(jié)將通過(guò)比較二者的異同來(lái)介紹唯一性約束。1.二者的相同點(diǎn)2.二者的不同點(diǎn)11.3.3創(chuàng)建唯一性約束可以利用創(chuàng)建約束的一般語(yǔ)法來(lái)新建唯一性約束。在創(chuàng)建成功之后,同樣可以利用數(shù)據(jù)字典獲取其詳細(xì)信息。1.創(chuàng)建唯一性約束創(chuàng)建唯一性約束的語(yǔ)法如下所示。altertable表名addconstraint約束名稱unquie(列名1、列名2…)其中unique表示該約束是一個(gè)唯一性約束;小括號(hào)內(nèi)指定唯一性約束創(chuàng)建在哪些列之上,多列之間使用逗號(hào)進(jìn)行分隔。11.3.3創(chuàng)建唯一性約束2.查詢唯一性約束的詳細(xì)信息對(duì)于唯一性約束,同樣可以在視圖user_constraints及user_cons_columns中獲取其信息。11.3.3創(chuàng)建唯一性約束3.驗(yàn)證唯一性約束的有效性唯一性約束創(chuàng)建之后,要求在約束列上的值(或值的組合)保持一致。例如,對(duì)于表employeenew,該表具有一個(gè)建立在列email之上的唯一性約束?!臼纠?1-26】查看表employeenew中的現(xiàn)有記錄。嘗試向其中插入新的數(shù)據(jù),新紀(jì)錄的email值與id是208的員工重復(fù)【示例11-27】值得注意的是,唯一性約束列允許空值存在,我們可以將列email的數(shù)據(jù)置為空,再次進(jìn)行驗(yàn)證。11.3.4修改唯一性約束唯一性約束創(chuàng)建之后,可以對(duì)其進(jìn)行刪除、重命名、禁用/啟用等操作。1.刪除唯一性約束一個(gè)表中可以包含多個(gè)唯一性約束。對(duì)于不再需要的唯一性約束,同樣可以使用dropconstraint選項(xiàng)進(jìn)行刪除?!臼纠?1-28】假設(shè),隨著業(yè)務(wù)的需求和發(fā)展,表employeenew上的唯一性約束uk_employeenew不再需要,那么可以利用如下SQL語(yǔ)句進(jìn)行刪除。11.3.4修改唯一性約束2.重命名唯一性約束已經(jīng)創(chuàng)建的約束可以將其重命名。其語(yǔ)法形式如下所示。altertable表名rename

constraint原約束名to目標(biāo)約束名【示例11-29】例如,將表employeenew上創(chuàng)建的唯一性約束uk_employeenew重命名為uk_em,那么,可以利用rename選項(xiàng)進(jìn)行重命名。11.3.4修改唯一性約束4.禁用/啟用唯一性約束成功創(chuàng)建的約束,可以對(duì)其進(jìn)行禁用/啟用操作。唯一性約束一旦禁用,當(dāng)數(shù)據(jù)表狀態(tài)發(fā)生改變時(shí),Oracle不再利用該約束進(jìn)行校驗(yàn)。但是,當(dāng)啟用時(shí),將對(duì)表中所有數(shù)據(jù)進(jìn)行校驗(yàn)。禁用/啟用唯一性約束的語(yǔ)法遵循統(tǒng)一語(yǔ)法。altertable表名disable/enableconstraint約束名稱【示例11-30】對(duì)于表employeenew,首先禁用其唯一性約束uk_em。11.4使用檢查約束檢查約束能夠規(guī)定每一個(gè)列輸入的值,保證數(shù)據(jù)的正確性。前面講的主鍵約束、外鍵約束與唯一性約束都有同一個(gè)特點(diǎn),那就是它們都體現(xiàn)記錄之間的相互關(guān)系,如下表所示。約束名稱主要作用作用描述主鍵實(shí)體完整性同一表中的記錄的唯一性標(biāo)識(shí)外鍵參照完整性兩個(gè)表中的記錄的主從關(guān)系唯一性約束記錄唯一性同一表中不同記錄的區(qū)分11.4.1為什么要使用檢查約束檢查約束用來(lái)約束表中列的輸入值的范圍。比如在輸入性別時(shí),要求在數(shù)據(jù)庫(kù)中只能輸入男或者女,就可以使用檢查約束來(lái)約束該列。檢查約束實(shí)質(zhì)是一個(gè)布爾表達(dá)式。一旦在數(shù)據(jù)表上創(chuàng)建了檢查約束,那么該檢查約束將在數(shù)據(jù)更新時(shí)計(jì)算布爾表達(dá)式的值。一個(gè)檢查約束可以用來(lái)限制某列的取值范圍,還可以用來(lái)限制多列之間的關(guān)系。11.4.2創(chuàng)建檢查約束我們可以使用PL/SQL語(yǔ)句創(chuàng)建檢查約束,在成功創(chuàng)建之后還可以查詢其詳細(xì)信息。1.創(chuàng)建檢查約束創(chuàng)建檢查約束時(shí)需要將約束的具體類型定義為check,如下所示。altertable表名addconstraint約束名check(布爾表達(dá)式)其中,altertable命令用于修改表的屬性;addconstraint用于添加約束;check選項(xiàng)指定新建約束為一個(gè)檢查約束;小括號(hào)內(nèi)的布爾表達(dá)式代表檢查約束的定義。在表employeenew中,列salary代表員工薪資。我們需要限制薪資是大于0的,那么應(yīng)該為表employeenew添加檢查約束。11.4.2創(chuàng)建檢查約束2.查詢檢查約束的詳細(xì)信息可以利用數(shù)據(jù)字典user_constraints與user_cons_columns查看檢查約束的詳細(xì)信息。11.4.2創(chuàng)建檢查約束3.驗(yàn)證檢查約束的作用在成功創(chuàng)建檢查約束ck_sa之后,可以嘗試向其中插入非法數(shù)據(jù),以驗(yàn)證其作用。11.4.2創(chuàng)建檢查約束4.多條件檢查約束檢查約束可以對(duì)多個(gè)條件同時(shí)進(jìn)行校驗(yàn)。這些條件使用邏輯運(yùn)算符進(jìn)行聯(lián)接?!臼纠?1-31】在表employeenew中,含有列hire_date與列department_id,都不可以為空,可以為該表創(chuàng)建一個(gè)檢查約束,該檢查約束含有這兩種檢查條件,分別用來(lái)保證各自列不為空。11.4.3修改檢查約束檢查約束創(chuàng)建之后,可以對(duì)檢查約束進(jìn)行重命名、刪除和禁用/啟用等操作。1.重命名檢查約束檢查約束的重命名與其他約束的重命名具有完全相同的語(yǔ)法,即利用rename選項(xiàng)。例如,將檢查約束ck_sa重命名為ck_salary。11.4.3修改檢查約束2.禁用/啟用檢查約束檢查約束的禁用/啟用操作應(yīng)當(dāng)使用disable/enable選項(xiàng)。11.4.3修改檢查約束3.刪除檢查約束檢查約束的刪除操作應(yīng)當(dāng)使用drop選項(xiàng)。例如,刪除檢查約束ck_hire_de。11.5使用默認(rèn)值約束在前面章節(jié)中講述了主鍵約束、外鍵約束、唯一性約束和檢查約束,我們可以利用下表進(jìn)行概括。本節(jié)主要講解默認(rèn)值約束。默認(rèn)值約束是針對(duì)記錄的列本身進(jìn)行約束。約束名稱主要作用作用描述主鍵實(shí)體完整性同一表中的記錄的唯一性標(biāo)識(shí)外鍵參照完整性兩個(gè)表中的記錄的主從關(guān)系唯一性約束記錄唯一性同一表中不同記錄的區(qū)分檢查約束列的取值限制同一記錄中列的取值范圍或列之間的關(guān)系11.5.1為什么要使用默認(rèn)值約束創(chuàng)建數(shù)據(jù)表之后,為了避免在插入語(yǔ)句中為其顯式賦值,可以為該列指定默認(rèn)值。當(dāng)用戶在插入數(shù)據(jù)時(shí),不對(duì)該列顯式賦值,從而減少了用戶的工作量,提高了工作效率。在創(chuàng)建數(shù)據(jù)庫(kù)表時(shí),我們可以指定一個(gè)DEFAULT值(即默認(rèn)值)。對(duì)數(shù)據(jù)庫(kù)字段使用默認(rèn)值有助于將數(shù)據(jù)庫(kù)設(shè)計(jì)問(wèn)題。當(dāng)沒(méi)有設(shè)定默認(rèn)值約束時(shí),我們可以將列的默認(rèn)值看做空,即null;當(dāng)顯式設(shè)定默認(rèn)值時(shí),列的默認(rèn)值發(fā)生改變。因此,我們可以認(rèn)為列的默認(rèn)值總是存在的。11.5.2創(chuàng)建默認(rèn)值約束創(chuàng)建默認(rèn)值約束之后,還是可以使用相應(yīng)的數(shù)據(jù)字典獲得默認(rèn)約束的相關(guān)信息。1.創(chuàng)建默認(rèn)值約束默認(rèn)值約束是作為列的屬性存在。因此,創(chuàng)建默認(rèn)值約束實(shí)際是通過(guò)修改列屬性的途徑來(lái)實(shí)現(xiàn)的。創(chuàng)建默認(rèn)值約束應(yīng)該使用modify選項(xiàng),并指定約束類型為default(默認(rèn)值)?!臼纠?1-32】例如,指定表employeenew的列hire_date的默認(rèn)值為系統(tǒng)的當(dāng)天日期。11.5.2創(chuàng)建默認(rèn)值約束2.查看默認(rèn)值約束的信息默認(rèn)值約束并不是作為表的屬性,而是作為列的屬性而存在的。user_constraints中的約束都是針對(duì)表而言,因此,無(wú)法在數(shù)據(jù)字典user_constraints中獲得其信息。而數(shù)據(jù)字典user_tab_columns包含了所有用戶列的信息。11.5.3修改默認(rèn)值約束默認(rèn)值約束的創(chuàng)建之后,可以對(duì)其進(jìn)行刪除。刪除默認(rèn)值約束的方式為將其設(shè)置為null。【示例11-34】在表employeenew中,刪除列hire_date的默認(rèn)值。11.6使用非空約束非空約束同樣是針對(duì)表的列所進(jìn)行的約束。非空約束用于限制列值不能為空。非空約束可以實(shí)現(xiàn)數(shù)據(jù)的域完整性。11.6.1為什么要使用非空約束一般在默認(rèn)情況下,數(shù)據(jù)表的列值允許為空。但是,有時(shí)候,并不允許用戶忽略列值。所以,必須使用非空約束保證列值不為空。前面章節(jié)已經(jīng)詳細(xì)講解了主鍵約束、唯一性約束、檢查約束、默認(rèn)值約束。本小節(jié)主要講解非空約束的創(chuàng)建與使用,以及非空約束與其它約束的比較。11.6.1為什么要使用非空約束1.非空約束與檢查約束檢查約束可以限制數(shù)據(jù)表中的某列的取值范圍。當(dāng)這個(gè)取值范圍被限定為非空(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論