版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)完整性的維護(hù)數(shù)據(jù)庫(kù)設(shè)計(jì)中有一個(gè)重要的環(huán)節(jié)就是建立數(shù)據(jù)模型來體現(xiàn)業(yè)務(wù)流程和規(guī)則。數(shù)據(jù)完整性就是業(yè)務(wù)規(guī)則的一種體現(xiàn),是業(yè)務(wù)流程能夠正常運(yùn)轉(zhuǎn)的保證。如何來實(shí)現(xiàn)數(shù)據(jù)的完整性呢?主要可以通過以下三個(gè)途徑來實(shí)現(xiàn):(1)應(yīng)用程序代碼實(shí)現(xiàn)(2)數(shù)據(jù)庫(kù)的觸發(fā)處理(3)數(shù)據(jù)完整性約束的定義應(yīng)用程序代碼實(shí)現(xiàn):指通過數(shù)據(jù)庫(kù)的后臺(tái)程序或客戶端的應(yīng)用程序來實(shí)現(xiàn)數(shù)據(jù)庫(kù)的觸發(fā)處理:指當(dāng)一個(gè)事件(比如INSERT一條記錄或UPDATE一個(gè)表的某個(gè)字段)產(chǎn)生時(shí),一個(gè)和這個(gè)事件相關(guān)的PL/SQL程序是否可以執(zhí)行。數(shù)據(jù)庫(kù)觸發(fā)器一般是應(yīng)用于復(fù)雜業(yè)務(wù)規(guī)則中,因?yàn)閿?shù)據(jù)完整性約束不好定義。下面是這篇文章主要要講解的數(shù)據(jù)完整性約束的定義使用數(shù)據(jù)完整性約束的優(yōu)越性:(1) 提供優(yōu)良的性能(2)不需要編碼,容易定義和修改(3) 集中式管理(4) 靈活性高(可以DISABLED或ENABLED)(5) 在數(shù)據(jù)字典中有完整的記錄約束的種類:(1) NOTNULL(2) UNIQUE(3) PRIMARYKEY:一個(gè)表只能有一個(gè)主鍵,相當(dāng)于NOTNULL+UNIQUE(4) CHECK(5) FOREIGNKEY約束的狀態(tài):(1) DISABLENOVALIDATE:不檢查表中數(shù)據(jù)的完整性,同時(shí)新增的數(shù)據(jù)是否符合約束也不做檢查,缺省狀態(tài)(2) DISABLEVALIDATE:任何對(duì)于該約束的修改都是不允許的SQL>altertableb2disablenovalidateconstraintsb2_con;表已更改。SQL>insertintob2(b)values('10');insertintob2(b)values('10')ERROR位于第1行:ORA-25128:不能對(duì)帶有禁用和驗(yàn)證約束條件(SYS.B2_CON)的表進(jìn)行插入/更新/刪除(3) ENABLENOVALIDATE:任何違反約束的新數(shù)據(jù)都不能執(zhí)行,但對(duì)表中已有違反約束的數(shù)據(jù)不做檢查。(4) ENABLEVALIDATE:任何違反約束的新數(shù)據(jù)都不能執(zhí)行,并對(duì)表中已有的數(shù)據(jù)的合法性進(jìn)行檢查,缺省狀態(tài)。如果一個(gè)約束從 DISABLE狀態(tài)直接變成ENALBEVALIDATE狀態(tài),則這個(gè)表將鎖住并檢查數(shù)據(jù)的合法性,這將影響DML操作,造成等待。所以應(yīng)該先從DISABLE狀態(tài)改變成ENABLENOVALIDATE狀態(tài),再改變成ENABLEVALIDATE狀態(tài)。注意點(diǎn):當(dāng)一個(gè)UNIQUE,PARIMAYKEY約束從ENABLE轉(zhuǎn)變成DISABLE狀態(tài),則這個(gè)約束上的UNIQUE索引(自動(dòng)創(chuàng)建的或手工創(chuàng)建的,如果先手工創(chuàng)建了一個(gè)索引,則創(chuàng)建約束時(shí)不再自動(dòng)創(chuàng)建索引了,而直接應(yīng)用手工創(chuàng)建的索引) DROP了。如果從DISABLE狀態(tài)轉(zhuǎn)變成ENABLE狀態(tài),數(shù)據(jù)庫(kù)會(huì)自動(dòng)以約束名創(chuàng)建一個(gè)UNIQUE索引。如果CONSTRAINTS是DEFERRED,則索引不會(huì)DROP掉。當(dāng)CONSTRAINTS創(chuàng)建時(shí)是DEFERRED,則自動(dòng)創(chuàng)建的索引是NONUNIQUE。SQL>createtabletestl(avarchar2(10),bvarchar2(10));表已創(chuàng)建。SQL>createuniqueindextest1_inxontest1(a);索引已創(chuàng)建。SQL>altertabletest1addconstraintstest1_conprimarykey(a,b);表已更改。SQL>selectindex_namefromdba_indexeswheretable_name='TEST1';INDEX_NAMETEST1_INXTEST1_CONSQL>ALTERTABLETEST1DISABLEconstraintstest1_con;表已更改。SQL>/INDEX_NAMETEST1_INXSQL>ALTERTABLETEST1enableconstraintstest1_con;表已更改。SQL>/INDEX_NAMETEST1_INXTEST1_CON約束的檢查方式:Immediateconstraints:應(yīng)用于每條DML語(yǔ)句,不可應(yīng)用在一個(gè)事務(wù)處理之后Deferredconstraints:應(yīng)用在事務(wù)處理中,在事務(wù)提交之前僅僅是檢查,如果在遞交的時(shí)候,發(fā)現(xiàn)有不合法數(shù)據(jù),整個(gè)事務(wù)回退。設(shè)置約束檢查方式的語(yǔ)法:SETCONSTRAINTS語(yǔ)句:可以指定具體某個(gè)約束或所有的。不可以在TRIGGER中使用ALTERSESSION語(yǔ)句:設(shè)置所有的約束,應(yīng)用對(duì)象是當(dāng)前會(huì)話SQL:ALTERSESSIONSETCONSTRAINTS={IMMEDIATE|DEFERRED|DEFAULT}SQL*PLUS:SETCONSTRAINT|CONSTRAINTS{constraint|ALL}{IMMEDIATE|DEFERRED}約束創(chuàng)建語(yǔ)句:字段級(jí)的columndatatype[CONSTRAINTconstraint]{[NOT]NULL|UNIQUE[USINGINDEXindex_clause]|PRIMARYKEY[USINGINDEXindex_clause]|REFERENCES[schema.]table[(column)][ONDELETECASCADE]|CHECK(condition)}constraint_state:==[NOTDEFERRABLE|DEFERRABLE[INITIALLY{IMMEDIATE|DEFERRED}]][DISABLE|ENABLE[VALIDATE|NOVALIDATE]]表級(jí)的,NOTNULL約束不能在表級(jí)約束子句中定義[CONSTRAINTconstraint]{PRIMARYKEY(column[,column]...)[USINGINDEXindex_clause]|UNIQUE(column[,column]...)[USINGINDEXindex_clause]|FOREIGNKEY(column[,column]...)REFERENCES[schema.]table[(column[,column]...)][ONDELETECASCADE]|CHECK(condition)}[constraint_state]例如:SQL>createtabletestl(avarchar2(10),bvarchar2(10),constrainttest_conprimarykey(a),constrainttest_con1unique(b));表已創(chuàng)建。(3)表創(chuàng)建好后,還可以用ALTERTABLE語(yǔ)句來增加約束SQL>altertabletest1addconstraintstest1_conprimarykey(a)deferrableinitiallydeferred;表已更改。SQL>altertabletest1modifybconstrainttest1_con1notnull;表已更改。關(guān)于約束創(chuàng)建時(shí)注意點(diǎn):索引和表應(yīng)該創(chuàng)建在不同的表空間中,可以通過USINGINDEX子句或通過CREATETABLE,CREATEINDEX,ALTERTABLEADDCONSTRAINT來創(chuàng)建如果頻繁的裝載數(shù)據(jù)到表中,DISABLECONSTRAINT會(huì)使性能更好,裝載數(shù)據(jù)后,再ENABLECONSTRAINTSo可以通過DEFERREDCONSTRAINT來自動(dòng)創(chuàng)建非唯一性索引來提高性能。ENABLECONSTRAINTS有兩種方法可以ENABLECONSTRAINTSENABLENOVALIDATE:因?yàn)镻RIMARYKEY或UNIQUE約束會(huì)創(chuàng)建索引,并且當(dāng)該約束是DEFERRED的,貝0NOVALIDATE會(huì)比VALIDATE快很多,因?yàn)榇嬖诘臄?shù)據(jù)不會(huì)做檢查的,不會(huì)在表上產(chǎn)生LOCK的。注意點(diǎn):使用ENALBENOVALIDATE時(shí),如果要應(yīng)用索引,則約束必須是DEFERRED的,否則就沒有優(yōu)越性了。因?yàn)镺RACLE會(huì)鎖住表去創(chuàng)建索引的。ENABLEVALIDATE:表被鎖住直到存在數(shù)據(jù)的合法性檢查完成,如果沒有索引的話,ORACLE還要自動(dòng)創(chuàng)建唯一性索引為PRIMARYKEY或UNIQUE,或創(chuàng)建非唯一性索引為DEFERRED的PRIMARYKEY或UNIQUE從NOVALIDATE轉(zhuǎn)到VALIDATE的優(yōu)越性不會(huì)產(chǎn)生表鎖定所有的約束是同時(shí)ENABLED每個(gè)約束內(nèi)部是并行處理的表上同時(shí)活動(dòng)的事務(wù)的允許的。語(yǔ)法:ALTERTABLE[schema.]tableENABLE[VALIDATE]{CONSTRAINTconstraint
|PRIMARYKEY|UNIQUE(column[,column]...)}[USINGINDEXindex_clause][EXCEPTIONSINTO[schema.]table]如果要執(zhí)行EXCEPTIONS子句,需要先執(zhí)行RDBMS\ADMIN\UTLEXPT1.SQL腳本創(chuàng)建EXCEPTIONS表查詢約束的數(shù)據(jù)字典:DBA_CONSTRAINTS一些字段的說明NameDescriptionCONSTRAINT_TYPEThetypeofconstraintisPifPrimaryKey,UifUnique,Rifforeignkey,orCifCheckconstraint.NOTNULLconstraintsarestoredascheckconstraints.SEARCH_CONDITIONShowstheconditionspecifiedforacheckconstraintR_OWNERR_CONSTRAINT_NAMEDefinestheownerandnameofthereferencedconstraintforforeignkeysGENERATEDIndicateswhethertheconstraintnameissystem-generated(ValidvaluesareUSERNAMEandGENERATEDNAME.)BADIndicatesthattheconstraintistoberewrittentoavoidsituationssuchastheYear2000problemsRELYIsusedintheoptimizer,ifthisflagissetLAST_CHANGEShowsthedatewhentheconstraintwaslastenabledordisabledSQL>colcolumn_nameformata15SQL>l1SELECTc.constraint_name,c.constraint_type2cc.column_name3FROMdba_constraintsc,dba_cons_columnscc4WHEREc.owner='BROWER'5ANDc.table_name='EMP'6ANDc.owner=cc.owner7ANDc.constraint_name=cc.constraint_name8*ORDERBYcc.positionSQL>SELECTc.constraint_nameAS"Fore
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中化學(xué)實(shí)驗(yàn)室安全管理制度
- 醫(yī)院醫(yī)保賬戶服務(wù)合同模板(2篇)
- 前期物業(yè)合同(2篇)
- 路線最優(yōu) c課程設(shè)計(jì)
- 1電纜通道維修施工方案
- 計(jì)算器電路課程設(shè)計(jì)
- 洗滌機(jī)械行業(yè)全景解析
- 砂輪的設(shè)計(jì)課程設(shè)計(jì)
- 貨運(yùn)組織課程設(shè)計(jì)大圖
- 火車票座位分配課程設(shè)計(jì)
- 南開《數(shù)據(jù)科學(xué)導(dǎo)論》20春期末考核答案
- SL/T212-2020 水工預(yù)應(yīng)力錨固技術(shù)規(guī)范_(高清-有效)
- 小學(xué)四年級(jí)中華優(yōu)秀傳統(tǒng)文化教案小學(xué)四年級(jí)山東友誼出版社
- 英語(yǔ)主格賓格所有格一覽表
- 《龜兔賽跑》PPT課件.ppt
- 兒科危急值項(xiàng)目及評(píng)價(jià)報(bào)告制度
- 【學(xué)案】 Unit 1 Grammar Predicative clauses 學(xué)案-人教版(2019)選擇性必修第二冊(cè)
- 工程咨詢收費(fèi)標(biāo)準(zhǔn)國(guó)家計(jì)委1283號(hào)文
- 5-10萬(wàn)山平塘設(shè)計(jì)報(bào)告
- 職業(yè)衛(wèi)生警示標(biāo)志
- B2B第三方電子商務(wù)平臺(tái)——基于環(huán)球資源網(wǎng)模式分析
評(píng)論
0/150
提交評(píng)論