oracle报错唯一主键约束,oracle 主键约束的规定,RT

满意答案

00e27ab806e4881f8254fe7ae8741834.png

shilvmengl

2014.03.24

00e27ab806e4881f8254fe7ae8741834.png

采纳率: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分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值