我列出我全部的做法:
table a 有id1, str1, str2, str3
开始的pk是id1, str1, str2
希望改成id1, str1, str3
--问题
小弟先有如下问题:
一个表原来的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;
但是还是提示会出错,哪位大虾给帮忙一下~~
急啊!在线等!!!!
我的步骤:
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
回答----原因分析
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>