小弟先有如下问题:一个表原来的PK是 id1+str1+str2 列
先修改成id1+str1+str3列
而这三列现在当前数据库的数据有重复的情况, 小弟现在用sql:
ALTER table a add 
  constraint PK_a primary key (id1,str1,str3)  
    USING INDEX TABLESPACE ts
      ENABLE NOVALIDATE;但是还是提示会出错,哪位大虾给帮忙一下~~
急啊!在线等!!!!

解决方案 »

  1.   

    先 drop 掉原来的 primary key,才能创建新的alter table tablename drop primary key cascade;
      

  2.   

    忘了说了,以前的pk已经drop了
      

  3.   

    现在问题是如果去不validate以前的id1+str1+str3 三列数据
    enable novalidate不行?
      

  4.   

    我列出我全部的做法:table a 有id1, str1, str2, str3开始的pk是id1, str1, str2
    希望改成id1, str1, str3我的步骤:
    Alter table a drop primary key drop index;
    ALTER table a add 
      constraint PK_a primary key (id1, str1, str3)  
        USING INDEX TABLESPACE ts
          ENABLE NOVALIDATE;
    提示的错误:
    SQL> ALTER table evanpk add 
      2    constraint PK_evanpk primary key (id1, str1, str2)  
        USING INDEX TABLESPACE WBXOBJ_LARGE_IDX 
      3    4        ENABLE NOVALIDATE;
      constraint PK_evanpk primary key (id1, str1, str2)
                 *
    ERROR at line 2:
    ORA-02437: cannot validate (TEST.PK_EVANPK) - primary key violated
      

  5.   

    SQL> create table t1(c1 number,c2 varchar2(10));表已创建。SQL> insert into t1 values(1,1);已创建 1 行。SQL> insert into t1 values(1,2);已创建 1 行。SQL> alter table t1 add constraint pk_t1 primary key(c1) enable novalidate;
    alter table t1 add constraint pk_t1 primary key(c1) enable novalidate
                                  *
    第 1 行出现错误:
    ORA-02437: 无法验证 (TEST.PK_T1) - 违反主键
    SQL> create index idx_t1 on t1(c1);索引已创建。SQL> alter table t1 add constraint pk_t1 primary key(c1) using index idx_t1 enab
    le novalidate;表已更改。SQL> insert into t1 values(2,2);已创建 1 行。SQL> insert into t1 values(2,3);
    insert into t1 values(2,3)
    *
    第 1 行出现错误:
    ORA-00001: 违反唯一约束条件 (TEST.PK_T1)
    SQL>
      

  6.   

    enable novalidate的意思是启用约束时不对已存在的数据做检查。