首页 > 数据库 > 数据库开发技术 > 语法novalidate对添加主键约束不起作用
最近在看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博客 ” ,链接:https://blog.itpub.net/3898/viewspace-818577/ ,如需转载,请注明出处,否则将追究法律责任。