zoukankan      html  css  js  c++  java
  • 关于约束ENABLE NOVALIDATE的一个疑问

    http://www.dbunix.com/?p=188

    关于约束ENABLE NOVALIDATE的一个疑问

    CREATE TABLE test
    (id varchar2(12),
    name varchar2(30) ,CONSTRAINT pk_test PRIMARY k
     
    ALTER TABLE test disable CONSTRAINT pk_test

    然后向表中插入两条完全一样的数据并commit

    我的印象是ENABLE NOVALIDATE并不检查已经存在的数

    SQL> ALTER TABLE test enable novalidate constra
    ALTER TABLE test enable novalidate CONSTRAINT p
    *
    ERROR 位于第 1 行:
    ORA-02437: 无法验证 (DBO.PK_TEST) - 违反主键

    参考hrb_qiuyb文章

    SQL> CREATE TABLE t(a INT,b varchar2(20));
     
    TABLE created.
     
    SQL> INSERT INTO t VALUES(1,'lijie');
     
    1 ROW created.
     
    SQL> ALTER TABLE t ADD constraints pk_t_a PRIMARY KEY(a);
     
    TABLE altered.
     
    SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints
    WHERE TABLE_NAME='T';
     
    CONSTRAINT_NAME                C STATUS
    ------------------------------ - --------
    PK_T_A                         P ENABLED
     
    SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T';
     
    INDEX_NAME                     UNIQUENES
    ------------------------------ ---------
    PK_T_A                         UNIQUE
     
    SQL> ALTER TABLE t disable constraints pk_t_a;
     
    TABLE altered.
     
    SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints
    WHERE TABLE_NAME='T';
     
    CONSTRAINT_NAME                C STATUS
    ------------------------------ - --------
    PK_T_A                         P DISABLED
    SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T';
     
    no ROWS selected
     
    SQL> INSERT INTO t VALUES(1,'tina');
     
    1 ROW created.
     
    SQL> ALTER TABLE t enable novalidate constraints pk_t_a;
    ALTER TABLE t enable novalidate constraints pk_t_a
    *
    ERROR at line 1:
    ORA-02437: cannot validate (TAOBAO.PK_T_A) - PRIMARY KEY violated

    这里问题是:primary key所依赖的唯一键索引起的.

    解决方法:

    SQL> CREATE TABLE t2 AS (SELECT * FROM t WHERE 1=0);
     
    TABLE created.
     
    SQL> CREATE INDEX ind_t2_a ON t2(a);
     
    INDEX created.
     
    SQL> INSERT INTO t2 VALUES(1,'lijie');
     
    1 ROW created.
     
    SQL> ALTER TABLE t2 ADD constraints pk_t2_a PRIMARY KEY(a);
     
    TABLE altered.
     
    SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints
    WHERE TABLE_NAME='T2';
     
    CONSTRAINT_NAME                C STATUS
    ------------------------------ - --------
    PK_T2_A                        P ENABLED
     
    SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T2';
     
    INDEX_NAME                     UNIQUENES
    ------------------------------ ---------
    IND_T2_A                       NONUNIQUE
     
    SQL> ALTER TABLE t2 disable constraints pk_t2_a;
     
    TABLE altered.
     
    SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints
    WHERE TABLE_NAME='T2';
     
    CONSTRAINT_NAME                C STATUS
    ------------------------------ - --------
    PK_T2_A                        P DISABLED
     
    SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T2';
     
    INDEX_NAME                     UNIQUENES
    ------------------------------ ---------
    IND_T2_A                       NONUNIQUE
     
    SQL> INSERT INTO t2 VALUES(1,'tina');
     
    1 ROW created.
     
    SQL> ALTER TABLE t2 enable validate  constraints pk_t2_a;
    ALTER TABLE t2 enable validate  constraints pk_t2_a
    *
    ERROR at line 1:
    ORA-02437: cannot validate (TAOBAO.PK_T2_A) - PRIMARY KEY violated
    SQL> ALTER TABLE t2 enable novalidate constraints pk_t2_a;
     
    TABLE altered.

    One Response to “关于约束ENABLE NOVALIDATE的一个疑问”

  • 相关阅读:
    Six steps to create google map in the HTML5
    Vocabularies on vegetable, fruit, meat etc.
    常用的Windows命令
    sqlhelper
    素材
    sql sever 跨库查询
    在annotation中却会有ERROR: Duplicate entry
    一份Java学习路线图
    Java算法实例集合(2)
    Java编程规范实践
  • 原文地址:https://www.cnblogs.com/seasonzone/p/4229164.html
Copyright © 2011-2022 走看看