Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251088
  • 博文数量: 59
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 698
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-19 21:17
文章分类

全部博文(59)

文章存档

2009年(14)

2008年(45)

我的朋友

分类: Oracle

2008-10-27 19:39:51

约束测试
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)
阅读(926) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~