<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    Oracle約束的啟用和停用
    ?
    ??? 關于Oracle的約束概念和基本操作,我已經在以前的《Constraint基礎概念》、《Constraint的簡單操作》兩篇文章中有過比較詳細的介紹了,但是對于如何停用和啟用constraint沒有作特別的描述,以至于在使用PLSQL中無法忽略constraint而逐步進行數據的更改,所以在這里專門記錄一下關于constraint的停用和啟用相關知識。
    ?
    一、約束的狀態
    ?
    ??? 可以指定啟用(ENABLE)或者停用(DISABLE)約束。如果啟用約束,當在數據庫中輸入或者更新數據時要進行數據檢查,不符合約束規則的數據不能輸入數據庫。如果停用約束,那么不符合規則的數據也能輸入到數據庫中。 另外,也能制定表中的現有數據必須符合約束(VALIDATE);相反地,如果指定為(NOVALIDATE),就不能確?,F有的數據符合約束。
    ?
    ??? 所以由上述的特性可知,表上的約束可能處在以下4種狀態:
    ??? ● ENABLE , VALIDATE
    ??? ● ENABLE , NOVALIDATE
    ??? ● DISABLE, VALIDATE
    ??? ● DISABLE, NOVALIDATE
    ?
    1、停用約束的情況
    ?
    ??? 一般來說,約束都是需要始終處于啟用狀態的,但是在以下情況中可能需要約束停用:
    ?
    ??? ● 當往表中裝載大量數據時
    ??? ● 當執行批操作使得表有大規模的改變時
    ??? ● 到一次性導入或導出一個表時
    ?
    ??? 停用都是為了提高性能,特別是在數據倉庫中,這種操作的作用尤其明顯。而且由于停用約束有可能造成違反約束的數據輸入到表中,所以在進行完以上的動作之后,需要立即啟用約束。
    ?
    2、啟用約束的一些問題
    ?
    ??? 在停用約束時,違反約束的行可以插入到表中,這種行為被認為是對約束異常。而且如果約束處于啟用非校驗狀態(ENABLE,NOVALIDATE),則在停用時插入的違反約束的記錄仍然保留,需要更改后,約束方可出在已校驗狀態。
    ?
    ??? 當表的約束處于啟用非校驗狀態時,表中原本的數據可以不符合約束,但后面新增的數據必須進行校驗,這對于數據倉庫來說特別有用。因為基本上數據倉庫都是使用增量更新,在停用約束后如果采用啟用校驗約束狀態,則需要對大量數據進行校驗,影響性能。
    ?
    ??? 另外說明:校驗一個已經啟用的約束,在校驗期間不需要任何DML鎖,因此在校驗期間可以保證沒有引入違反約束的數據。
    ?
    3、完整性約束狀態:過程和效益
    ?
    ??? 一般可以按照以下的順序來使用約束,以確保最佳的效益:
    ?
    ??? ① 停用狀態
    ??? ② 執行操作(裝載、導出、導入)
    ??? ③ 啟用非校驗狀態
    ??? ④ 啟用狀態
    ?
    ??? 好處是:
    ?
    ??? ● 不留鎖
    ??? ● 所有的約束能夠同時處于啟用狀態
    ??? ● 約束啟用是并行實現的
    ??? ● 允許表上進行同步操作
    ?
    ?
    二、在定義中設置約束屬性
    ?
    ??? 在CREATE TABLE和ALTER TABLE語句中就可以設置約束的ENABLE/DISABLE、VALIDATE/NOVALIDATE。
    ??? 注:默認的是ENABLE/VALIDATE的。
    ?
    1、在定義中停用約束
    ?
    ??? CREATE TABLE emp( empno NUMBER(5) PRIMARY KEY DISABLE,
    ?????????????????? ?? deptno NUMBER(2));
    ?
    ??? ALTER TABLE emp ADD PRIMARY KEY(empno) DISABLE;
    ?
    2、在定義中啟用約束
    ?
    ??? CREATE TABLE emp( empno NUMBER(5) PRIMARY KEY,
    ?????????????????? ?? deptno NUMBER(2));
    ?
    ??? ALTER TABLE emp ADD PRIMARY KEY(empno);
    ???
    ? ? 注:有可能創建約束失敗,因為原始數據與約束沖突,此時語句回滾。
    ?
    3、修改或刪除現有的約束
    ?
    ??? 注:在使用外鍵參考了PRIMARY或UNIQUE鍵時,不能停用或刪除被參考約束
    ?
    ??? 停用:
    ??? ALTER TABLE dept DISABLE CONSTRAINT dname_ukey;
    ??? ALTER TABLE dept DISABLE PRIMARY KEY KEEP INDEX,
    ???????????????????? DISABLE UNIQUE (dname, loc) KEEP INDEX;
    ?
    ??? 啟用非校驗:
    ??? ALTER TABLE dept ENABLE CONSTRAINT dname_ukey;
    ??? ALTER TABLE dept ENABLE NOVALIDATE PRIMARY KEY,
    ???????????????????? ENABLE NOVALIDATE UNIQUE (dname, loc);
    ?
    ??? 啟用校驗:
    ??? ALTER TABLE dept MODIFY CONSTRAINT dname_ukey VALIDATE;
    ??? ALTER TABLE dept MODIFY PRIMARY KEY ENABLE NOVALIDATE;
    ?
    ??? 若要停用/刪除相關的FOREIGN KEY約束,則:
    ??? ALTER TABLE dept DISABLE PRIMARY KEY CASCADE;
    ?
    ??? 刪除:
    ??? ALTER TABLE dept DROP UNIQUE (dname, loc);
    ??? ALTER TABLE emp DROP PRIMARY KEY KEEP INDEX,
    ??????????????????? DROP CONSTRAINT dept_fkey;
    ?
    ?
    三、延時約束檢查
    ?
    ??? Oracle可以再事務中先不檢查約束,直到事務結束時才統一檢查。這樣就可以讓事務在處理的過程中暫時得違反約束,例如某時候在往表里添加數據時,某字段暫時留空,在下一步中再update數據,以逐步插入數據,這樣就必須用到這個性能。使用SET CONSTRAINTS語句進行設置。
    ?
    ??? 在使用這個特性時,需要注意幾點:
    ???
    ??? ● 不能在觸發器內發布SET CONSTRAINTS語句
    ??? ● 可延時的唯一鍵和主鍵必須使用非唯一索引
    ?
    1、所有約束設置成延時
    ?
    ??? SET CONSTRAINTS ALL DEFERRED;
    ?
    ??? 注:在所有處理前執行該語句,至事務結束時為止,只適用于當前會話。
    ?
    2、檢查提交(可選)
    ?
    ??? 在事務COMMIT之前,可以用 SET CONSTRAINTS ALL IMMEDIATE 語句來手工檢查約束的違反情況。雖然在事務結束時會自動隱性執行這條語句,但是也是有一定的存在意義的,例如希望在錯誤時定義某些操作。
    ?
    ?
    四、報告約束異常
    ?
    ??? 如果校驗約束時存在異常,則返回一個錯誤,且完整性約束仍保持未被校驗狀態。當約束存在異常時,一個語句就不能正確執行,則此語句被回滾。如果存在異常,必須要更新或刪除了約束的所有異常后,才可以校驗約束。但是在使用ALTER TABLE語句不能確定哪一行違反約束,為了確定哪一行,在發布ENABLE子句中帶有EXCEPTION選項的ALTER TABLE語句。
    ?
    ??? EXCEPTION選項將ROWID、OWNER、TABLE、ROWID、CONSTRAINT放到一個指定的表中。在啟用約束前,硬創建一個合適的異常報告表,用來接收ENABLE子句的EXCEPTION選項信息,可以直接執行'D:\oracle\ora92\rdbms\admin\utlexcpt.sql'或'D:\oracle\ora92\rdbms\admin\utlexcpt1.sql'腳本來進行創建。注意:這兩個腳本的區別在于數據庫的兼容性級別和所分析的表的類型。
    ?
    ??? 使用的語法如下:
    ?
    ??? ALTER TABLE dept ENABLE PRIMARY KEY EXCEPTIONS INTO EXCEPTIONS;
    ?
    ??? 如果存在異常,則直接查詢 SELECT * FROM EXCEPTIONS; 即可。如果需要更加詳細的信息,則可以使用ROWID與原表的ROWID進行關聯,這樣就可以查出原始表中當前行的所有信息,并進行修改。
    ?
    ?
    ?
    posted on 2009-07-26 22:17 decode360 閱讀(2286) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
    主站蜘蛛池模板: 在线a亚洲v天堂网2019无码| 色播在线永久免费视频网站| 图图资源网亚洲综合网站| 亚洲а∨天堂久久精品| 四虎影视大全免费入口| 精品成在人线AV无码免费看 | 四虎影视成人永久免费观看视频 | 青青草a免费线观a| 一级毛片**不卡免费播| a级片在线免费看| 久青草视频97国内免费影视| 免费一级毛片在线播放视频免费观看永久| 亚洲午夜精品一区二区公牛电影院| 亚洲2022国产成人精品无码区| 亚洲中文字幕无码久久精品1| 亚洲第一页综合图片自拍| 国产无遮挡吃胸膜奶免费看| 国产成人免费爽爽爽视频| 在线永久看片免费的视频| 最近2019中文字幕免费直播| 免费国产污网站在线观看15| 性xxxxx大片免费视频| 美女视频黄a视频全免费网站色窝 美女被cao网站免费看在线看 | 亚洲男同gay片| 亚洲精品9999久久久久无码| 亚洲字幕AV一区二区三区四区| 可以免费看黄的网站| 久久久久av无码免费网| 777成影片免费观看| 永久免费视频网站在线观看| 一级毛片视频免费| 产传媒61国产免费| 中文字幕看片在线a免费| 9久久免费国产精品特黄| 两个人看www免费视频| 免费毛片a线观看| 最近2019年免费中文字幕高清| 69av免费观看| 三年片在线观看免费大全 | 国产亚洲一区二区手机在线观看| 久久亚洲精品无码播放|