ITPub博客

首页 > 数据库 > 数据库开发技术 > 语法novalidate对添加主键约束不起作用

语法novalidate对添加主键约束不起作用

原创 数据库开发技术 作者:yaanzy 时间:2006-03-06 11:25:34 0 删除 编辑

最近在看tom的《Effective Oracle by design》,其中第6章6.3.8节有个例子是给表添加主键,但是不想对已经存在的数据进行校验:
alter table dept add constraint dept_pk primary key(deptno) rely enable novalidate;

我经过测试,发现即使加上novalidate语法也还是要检验的,测试如下:

[@more@]

SQL> create table aaa as select * from all_users;

Table created

SQL> insert into aaa select * from aaa;

29 rows inserted

SQL> alter table aaa add constraint pk_aaa primary key(username) rely enable novalidate;

alter table aaa add constraint pk_aaa primary key(username) rely enable novalidate

ORA-02437: 无法验证 (SMS.PK_AAA) - 违反主键

该测试在8.1.7.4、9.2.0.6、10.2.0.1中结果都一样,测试外键、check约束也都没有问题,就是主键不行!


最后发现问题所在:

创建主键时系统缺省还要同时创建一个唯一索引,novalidate只是使主键约束不对已经存在的数据
进行检验,并不对创建唯一索引进行控制,所以导致失败。可以在创建主键前先给该字段建个普通
非唯一索引,这样建主键时系统就会自动利用这个普通索引了。

SQL> create index ind_aaa on aaa(username);

Index created

SQL> alter table aaa add constraint pk_aaa primary key(username) rely enable novalidate;

Table altered


测试一下效果:

SQL> insert into aaa (username) values ('SYS');

insert into aaa (username) values ('SYS')

ORA-00001: 违反唯一约束条件 (SMS.PK_AAA)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/3898/viewspace-818577/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    108
  • 访问量
    766811