关于Oracle的约束概念和基本操作,我已经在以前的《Constraint基础概念》、《Constraint的简单操作》两篇文章中有过比较详细的介绍了,但是对于如何停用和启用constraint没有作特别的描述,以至于在使用PLSQL中无法忽略constraint而逐步进行数据的更改,所以在这里专门记录一下关于constraint的停用和启用相关知识。

 
一、约束的状态
 
    可以指定启用(ENABLE)或者停用(DISABLE)约束。如果启用约束,当在数据库中输入或者更新数据时要进行数据检查,不符合约束规则的数据不能输入数据库。如果停用约束,那么不符合规则的数据也能输入到数据库中。 另外,也能制定表中的现有数据必须符合约束(VALIDATE);相反地,如果指定为(NOVALIDATE),就不能确保现有的数据符合约束。
 
    所以由上述的特性可知,表上的约束可能处在以下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进行关联,这样就可以查出原始表中当前行的所有信息,并进行修改。

Oracle约束的启用和停用的更多相关文章

  1. SQL中约束和触发器的停用与启用

    如何对SQL中的约束和触发器进行停用与启用,如果有外键约束则相关联表都要进行相应操作. ALTER TABLE TableName CHECK CONSTRAIT ALL --检查约束 ALTER T ...

  2. ORACLE约束总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...

  3. 【Oracle】Oracle约束的总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...

  4. oracle监听,数据库,oracle服务器的启动和停用

    一.oracle监听,数据库,oracle服务器的启动和停用 使用root用户登录:切换用户su – root/root操作系统,一般只有root用户才有权限去操作系统中安装的oracle数据库服务器 ...

  5. oracle约束约束状态和设计习惯

    oracle约束状态有几个项目,会让人迷惑,分别是: enable/disable--是否启用/禁用 validate/invalidate--确认/不确认 deferrable/not deferr ...

  6. 转 ORACLE约束总结

    https://www.cnblogs.com/kerrycode/archive/2012/05/13/2454614.html 你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几 ...

  7. MacBook 启用或停用 root 用户

    启用或停用 root 用户 选取苹果菜单 () >“系统偏好设置”,然后点按“用户与群组”(或“帐户”). 点按 ,然后输入管理员名称和密码. 点按“登录选项”. 点按“加入”(或“编辑”). ...

  8. Oracle约束(Constraint)详解

    概述 约束是数据库用来确保数据满足业务规则的手段,不过在真正的企业开发中,除了主键约束这类具有强需求的约束,像外键约束,检查约束更多时候仅仅出现在数据库设计阶段,真实环境却很少应用,更多是放到程序逻辑 ...

  9. oracle 10g/11g RAC 启停归档模式

     oracle 10g rac 启停归档模式    假设Oracle数据库执行在归档模式,当进行数据库维护时,可能须要暂停数据库的归档,在完毕维护后,再又一次启动归档模式. 通过下面步骤能够从归档 ...

随机推荐

  1. MySQL学习笔记:case when

    一.MySQL case when的三种用法: 1.case 字段 when, 字段的具体值: select a.*, case sex when '1' then '男' else '女' end ...

  2. jmock2.5 基本教程

    目录 第0章 概述 第1章 jmock初体验 第2章 期望 第3章 返回值 第4章 参数匹配 第5章 指定方法调用次数 第6章 指定执行序列 第7章 状态机 第0章 概述 现在的dev不是仅仅要写co ...

  3. MySQL约束笔记

    MySQL 查看约束,添加约束,删除约束 添加列,修改列,删除列 · 查看表的字段信息:desc 表名; · 查看表的所有信息:show create table 表名; 添加主键约束:alter t ...

  4. pip常用命令总结(转载)

    基本的命令解释,如下图: 列出已安装的包 pip freeze or pip list 导出requirements.txt pip freeze > <目录>/requiremen ...

  5. Centos7配置vsftpd3.0.2

    1.安装vsftpd vsftp使用本地用户登陆方式 yum -y install vsftpd yum安装的版本3.0.2 2.配置vsftpd vim /etc/vsftpd/vsftpd.con ...

  6. JavaScript 三个常用对话框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. cetos6配置用msmtp和mutt发邮件(阿里云)

    Linux下可以直接用mail命令发送邮件,但是发件人是user@servername,如果机器没有外网的dns,其他人就无法回复.此时,有一个可以使用网络免费邮箱服务的邮件发送程序就比较重要了.ms ...

  8. USACO 完结的一些感想

    其实日期没有那么近啦……只是我偶尔还点进去造成的,导致我没有每一章刷完的纪念日了 但是全刷完是今天啦 讲真,题很锻炼思维能力,USACO保持着一贯猎奇的题目描述,以及尽量不用高级算法就完成的题解……例 ...

  9. Bubbo的启动时检查

    这个地方参考dubbo的官网,不是很难,为了使得文档的完整,也单独起一章. 1.默认 Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时, ...

  10. ubuntu12.04上的mongodb卸载

    如果您需要卸载 mongodb,然后有几种方法来完成这取决于你想实现. 一.卸载只是 mongodb 这将删除只是 mongodb 包本身. 1 sudo apt-get remove mongodb ...