约束测试
Create Table test(Id Number,Name Varchar2(10));
---添加约束插入数据
alter table TEST add constraint uniq_id unique (ID) Enable validate;
Insert Into test Values(1,'jack');
Insert Into test Values(2,'boss');
commit;
Insert Into test Values(1,'kate')--ora-00001 唯一性约束错误
---修改约束
1)alter table TEST Disable Novalidate constraint UNIQ_ID;
Insert Into test Values(1,'kate')--ora-00001 唯一性约束错误
Commit;
--上述说明对已经存在数据的表,如果disable一个约束,那么新数据,已经存在的数据都不进行该约束的校验。
--目前该表中的数据为
Select * From test;
ID NAME
---------- ----------
1 jack
2 boss
1 kate
1 kate
2)alter table TEST Disable Validate constraint UNIQ_ID;
--执行上述语句出错,因为validate一个约束,会对已经存在的数据进行约束校验,而新数据不进行约束校验,因此出现唯一性约束错误。
--如果alter table TEST Disable Validate constraint UNIQ_ID;语句执行成功,则针对该表的任何的dml操作都不允许。
insert into test values(3,'loop');
insert into test values(3,'loop')
*
ERROR at line 1:
ORA-25128: No insert/update/delete on table with constraint (SYS.UNIQ_ID) disabled and validated
--********************************************************
3)alter table TEST Enable Validate constraint UNIQ_ID;
--出现错误,因为该约束,新老数据都校验
4)Alter table TEST Enable Novalidate constraint UNIQ_ID;
---针对表里面已经有重复的主键信息,我们对已经有的数据不进行校验,而对每条新的数据进行唯一性约束校验。
---当我们enable一个主键或者是唯一约束时,都在在该表上自动创建唯一性索引。
---因此如果想上述语句执行正确可以采取如下方法:
Create Index indx_id On test(Id);
Alter table TEST Enable Novalidate constraint UNIQ_ID;
***********************************************************************************************
5)约束 deferred,Immediate
首先设置约束可以延迟,只有可推迟的约束才能进行如下设置;
Set Constraint UNIQ_ID Deferred
---约束是在dml就检验约束还是在提交的时候就检验约束?
SQL> insert into test values (1,'jack');
1 row created.
SQL> insert into test values (1,'jack');
1 row created.
SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-00001: unique constraint (SYS.UNIQ_ID) violated
-------------------------------------
SQL> Set Constraint UNIQ_ID Immediate ;
Constraint set.
SQL> insert into test values (1,'jack');
1 row created.
SQL> insert into test values (1,'jack');
insert into test values (1,'jack')
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.UNIQ_ID) violated
6)检查违反约束错误数据
@/oracle/10g/db/rdbms/admin/utlexcpt.Sql
alter table TEST Enable Validate constraint UNIQ_ID Exceptions Into Exceptions;
--然后查询该用户下的exceptions表,里面是所有重复数据的rowid
Select * From test Where Rowid In (Select row_id From Exceptions)
阅读(967) | 评论(0) | 转发(0) |