zoukankan      html  css  js  c++  java
  • Oracle之表示约束状态的关键字Enable/Disable/Validate/Novalidate

    Oracle约束的关键字Enable/Disable/Validate/Novalidate
    分类: [oracle]--[PL/SQL]

    小结:
    enable/disable对未来的数据有约束/无约束。


    validate/novalidate对已有的数据有约束/无约束。

     约束有如下四种状态

     (1)ENABLEVALIDATE:约束在创建时,默认就是此状态。此状态会“检查表中原有行和新插入的行”。

     (2)ENABLENOVALIDATE:不能输入违反约束的新数据。但是,在创建约束时,并不检查表中原有行。

     (3)DISABLEVALIDATE:检查表中原有行是否违反约束,表中可以插入违反约束的行。

     (4)DISABLENOVALIDATE:约束处于禁用状态,且此状态检查表中原有数据是否违反约束.

    参考博客:
    http://blog.csdn.net/guoyjoe/article/details/8640270


    注释:
    1、
    表中,未来的数据和已有的数据:
    已有的数据,表示执行alter table test validate(或是Novalidate) constraint ck_id前已经在表test中存在的数据,或是执行alter table test validate(或是Novalidate) constraint ck_id后每当执行了一次DML操作引起了存放于表中的数据的变化时都会进行一次约束条件检查,而进行该约束条件检查时存在于表中的数据也被称作已有的数据。
    未来的数据,表示执行alter table test Enable/Disable constraint ck_id后每当执行了一次DML操作时在修改后的数据存入表中来替代修改前值之前会进行一次约束条件检查。
    2、
    Enable/Disable和Validate/Novalidate这两组关键字修饰的都是同一个对象,即constraint这种类型的对象。
    在修饰同一个对象时,两组关键字间是并列关系,即Enable/Disable这组关键字作用在未来的数据(即表上插入/更新/删除的数据)上,而Validate/Novalidate这组关键字作用在表上已有的数据上。
    上图中,?表示不受约束条件限制,√表示受约束条件限制。
    这里要说说×表示什么意思?

    disable和validate组合在一起时,由于disable是表示对未来的数据不受约束条件限制,即对DML操作修改过的数据都不进行约束条件检查。现在假设一条不符合约束条件的数据插入了表中,而Validate/Novalidate这组关键字是每次表中的数据有变化时进行一次约束条件检查,故而当Validate在该条不符合约束条件的数据插入了表后进行了一次约束条件检查,发现该数据不符合约束条件,就会报错。由此看出disable和validate组合在一起时,DML操作修改的数据存放在表中有可能会不符合约束条件,所以oracle设计人员就规定disable和validate组合在一起时不允许进行DML操作对该表。所以,X表示不允许执行DML操作的意思。所以,如果你不想某个表被DML操作修改,则可以采用disable和validate组合在一起的方法。

    ===============================================================================================

    1组合特性说明


    Enable/Disable和Validate/Novalidate这两组关键字修饰的都是同一个对象,即constraint这种类型的对象。
    Validate的作用:      确保已有数据符合约束;

    Novalidate的作用:不必考虑已有数据是否符合约束。

    由此可以看出,

    Validate和Novalidate的不同点在于表中已有数据的作用上:

    Validate验证已有数据是否符合约束;Novalidate不必考虑已有数据是否符合约束。

    Validate和Novalidate的相同点在于表上插入/更新/删除的数据的作用上:
    对于表上插入/更新/删除的数据,两者都会确保这些数据符合约束。


    在修饰同一个对象时,两组关键字间不是并列关系,而是上下从属关系,即Enable/Disable这组关键字从属于Validate/Novalidate这组关键字。而且,在Validate/Novalidate这组关键字所作用的两个范围:表中已有数据和表上插入/更新/删除的数据中,Enable/Disable这组关键字只能影响一个范围,即表上插入/更新/删除的数据。

    Validate

    Novalidate

    已有记录

    新增/删除记录

    已有记录

    新增/删除记录

    Enable

    Yes(表示需要受到约束条件限制)

    Yes

    No

    Yes

    Disable

    Yes

    No

    No

    No

    从上表可以看出,

    对于带有Validate的约束(constraint,名词),无论Enable还是Disable该约束,该约束对表中已有记录都是会验证这些表中已有记录是否符合约束条件的,而对于带有noValidate的约束(constraint,名词),无论Enable还是Disable该约束,该约束对表中已有记录都是不会验证这些表中已有记录是否符合约束条件的。

    对于表上插入/更新/删除的数据,enable带有Validate的约束或是带有noValidate的约束,则都会验证这些表上插入/更新/删除的数据是否符合约束条件的;反之,Disable带有Validate的约束或是带有noValidate的约束,则都不会验证这些表上插入/更新/删除的数据是否符合约束条件的。

    例如,alter table test disable validate constraint ck_id,表示禁用(Disable)带有验证(Validate)属性的约束ck_id,其中
    Disable作为支配约束这个对象的动词来翻译,而Validate作为修饰约束这个对象的形容词来翻译。

    注释:

    Validate确保已有数据符合约束;

    Novalidate不必考虑已有数据是否符合约束。

    除非Novalidate被指定,Enable默认Validate;

    除非Validate被指定,Disable默认Novalidate。

    Enable Validate与Enable相同,表示检查已有记录和新增记录(即表上插入/更新/删除的数据),确保都符合约束;

    Enable Novalidate,表示允许已有记录不必满足约束条件,但新增/修改的记录(即表上插入/更新/删除的数据)必须满足;

    Disable Validate,表示禁用(带有Validate的)约束,删除约束上的索引(??),不允许修改任何被约束的记录(即表上插入/更新/删除的数据??);

    Disable Novalidate与Disable相同,表示禁用(带有noValidate的)禁用约束,删除约束上的索引(??),且允许修改被约束的记录(即表上插入/更新/删除的数据??)。

    2建表

    SQL> create table test(id int, name varchar2(10));

    Table created

    SQL> alter table test add constraint ck_id check(id > 10);

    Table altered

    3测试1: Enable Validate

    SQL> alter table test Enable validate constraint ck_id;

    Table altered

    SQL> insert into test values(5, 'Oracle');

    insert into test values(5, 'Oracle')

    ORA-02290:违反检查约束条件 (MYHR.CK_ID)

    SQL> insert into test values(17,'ERP');

    1 row inserted

    SQL> commit;

    Commit complete

    4测试2: Enable Novalidate

    SQL> alter table test disable constraint ck_id;

    Table altered

    SQL> insert into test values(5, 'Oracle');

    1 row inserted

    SQL> commit;

    Commit complete

    SQL> select * from test;

              ID NAME

    ----------- ----------

             17 ERP

               5 Oracle

    SQL> alter table test enable novalidate constraint ck_id;

    Table altered

    SQL> insert into test values(32, 'SAP');

    1 row inserted

    SQL> insert into test values(3, 'Linux');

    insert into test values(3, 'Linux')

    ORA-02290:违反检查约束条件 (MYHR.CK_ID)

    SQL> commit;

    Commit complete

    5测试3: Disable Validate

    SQL> delete from test where id < 10;

    1 row deleted

    SQL> commit;

    Commit complete

    SQL> alter table test disable validate constraint ck_id;

    Table altered

    SQL> select * from test;

                ID NAME

    ------------- ----------

                17 ERP

                32 SAP

    SQL> update test set name = 'Change' where id = 17;

    update test set name = 'Change' where id = 17

    ORA-25128:不能对带有禁用和验证约束条件 (MYHR.CK_ID)的表进行插入/更新/删除

    ORA-25128:no insert/update/delete on table with constraint disabled and validated

    6测试4: Disable Novalidate

    SQL> alter table test disable novalidate constraint ck_id;

    Table altered

    SQL> insert into test values(2, 'Linux');

    1 row inserted

    SQL> insert into test values(13, 'Windows');

    1 row inserted

    SQL> update test set name = 'Change' where id = 17;

    1 row updated

    SQL> commit;

    Commit complete

    SQL> select * from test;

             ID NAME

    ---------- ----------

             17 Change

             13 Windows

             32 SAP

              2 Linux
    ————————————————
    版权声明:本文为CSDN博主「haiross」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/haiross/article/details/41977717

  • 相关阅读:
    ssl
    [原创] Docker 安装 Lnmp 环境
    Oracle 的DBNEWID (NID)实用程序
    使用 convert database 命令进行 RMAN 跨平台迁移 (同版本)
    hbase2强制删除表
    zookeeper删除目录节点报错:Authentication is not valid : /hbase/tokenauth
    hbase1向hbase2表迁移
    /etc/sysconf/networkscripts/ifcfgeth0的手册到底在哪里
    Mycat新增数据报错can't fetch sequnce in db,sequnce
    从GitHub远程仓库中删除文件夹或文件
  • 原文地址:https://www.cnblogs.com/adamgq/p/12269646.html
Copyright © 2011-2022 走看看