满意答案
shilvmengl
2014.03.24
采纳率:40% 等级:10
已帮助:218人
如果你是想在主键约束启用的情况下插入违约数据那是不可能的。可以考虑先禁掉约束,再插入违约数据,然后更改约束到enable novalidate状态。
我做了个小实验,以供参考:
SQL> create table king (id int,name varchar2(20));
Table created.
SQL> alter table king add constraint pk_king primary key(id);
Table altered.
禁掉主键约束
SQL> alter table king disable novalidate constraint pk_king;
插入重复数据
SQL> insert into king values(1,'king');
1 row created.
SQL> insert into king values(1,'king');
1 row created.
SQL> commit
2 ;
Commit complete.
SQL> select * from king;
ID NAME
---------- --------------------
1 king
1 king
这时候要注意一下,对于主键和唯一约束,禁掉后你去查看它对应的索引也不存在了
SQL> select index_name from user_indexes where table_owner='KING';
no rows selected
需要给ID这个字段重新添加索引
SQL> create index idx_king on king(id);
Index created.
最后将主键约束的状态更改为enable novalidate状态
SQL> alter table king enable novalidate constraint pk_king;
Table altered.
原来的数据依旧存在
SQL> select * from king;
ID NAME
---------- --------------------
1 king
1 king
但是不可以插入新的违法数据了
SQL> insert into king values(1,'king');
insert into king values(1,'king')
*
ERROR at line 1:
ORA-00001: unique constraint (KING.PK_KING) violated
总结下:使用enable novalidate,使得约束忽略对过去数据的检查,但新插入数据不可违反约束。
00分享举报