Home >Database >Mysql Tutorial >Oracle中CONSTRAINT的四对属性

Oracle中CONSTRAINT的四对属性

WBOY
WBOYOriginal
2016-06-07 17:03:241188browse

summary:在data migrate时,某些表的约束总是困扰着我们,让我们的migratet举步维艰,如何利用约束本身的属性来处理这些问题呢?本文

summary:在data migrate时,某些表的约束总是困扰着我们,让我们的migratet举步维艰,如何利用约束本身的属性来处理这些问题呢?本文详细介绍了约束的四对属性: Deferrable/not deferrable, Deferred/immediate, enalbe/disable, validate/novalidate,以及如何应用这些属性灵活应对相关问题

1.     Deferrable,not deferrable(default value)

1)      这对属性是定义是否可以defer,defer是指作检查的时机,如果在commit的时check为Defer,否则为immediate .只有在设置Deferrable才可以设置另一个属性2-- Deferred,immediate.

2)      设置defer check的方法有两种(前提是建立了Deferrable的contraint)

a.       通过建contraint时指定Deferred值

b.      通过会话级别的语句修改

           SET CONSTRAINT(s) contraint_name/all  immediate/deferred.

3)      这对属性是在创建的constraint的时候定义的,不能被修改.

4)  notice:如果建立了Deferrable的uk或pk,只会建立相应的nonuniquce index,而不会建立uniquce index  

2.     Deferred,immediate(default value)  

1)      这对属性定义是否defer.   Deferred: check on commit; immediate: check immediate.

2)      If constraint is not deferrable,immediate is only choice.

3)      For  example:

 

CREATE TABLE games

  (scores NUMBER, CONSTRAINT unq_num UNIQUE (scores)

   INITIALLY DEFERRED DEFERRABLE);

insert into games values(1);

insert into games values(1);

commit;--在此报错

You will not get a error util you commit it;

 

SET CONSTRAINT(s) unq_num immediate;--修改属性

insert into games values(2);

insert into games values(2);--在此报错

commit;

You will get a error when you execute the second sql;

3.      novalidate, validate(default value)

1)      这对属性定义constraint是否对表中已经存在的数据作检查,例如:

create table t(id number);
insert   into t values(1);
insert   into t values(2);
alter table t add constraint ch_100 check(id>=100);  --失败
alter table t add constraint ch_100 check(id>=100) novalidate;--成功

2)      notice:与唯一索引相关的contraint(例如pk,uk),要做到以上的效果还必须设置为Deferrable(只是建立非唯一性索引),因为在维护索引是,如果违反了唯一性也会报错,所以必须建立非唯一性索引.例如:

drop table t;
create table t(id number);
insert   into t values(1);
insert   into t values(1);
alter table t add constraint ch_100 unique(id) ; --报错
alter table t add constraint ch_100  unique(id) novalidate; --报错
alter table t add constraint ch_100  unique(id)  deferrable  novalidate;--成功

4.     disable, enalbe(default value)      

1)      启用和禁用constraint.在新建pk和uk时定义了disable,将不建立相应的索引.

ALTER TABLE dept DISABLE CONSTRAINT dname_ukey;

ALTER TABLE dept ENABLE CONSTRAINT dname_ukey;

alter table t add constraint ch_100  unique(id) disable;

2)      DISABLE  uk或pk作了些什么:

Disable非deferrable 的pk、uk,将删除相应的索引(除非指定了keep index,但是keep下来的索引是唯一性的,insert数据时还是要作唯一性检查的),在enable时重建索引.

Disbale  deferrable 的pk、uk将保留原来的索引(因为原来的索引就是非唯一性的,不影响insert的操作).

3)      一些操作经验

KEEP INDEX要注意的:

  a.ALTER TABLE games  DISAble  CONSTRAINT fk_num keep index;--唯一索引被保留,所以还是不能插入重复的数据.不应该keep index.

  b.ALTER TABLE games  DISAble  CONSTRAINT fk_num;--如果上一步被执行,那么此语句什么都不做,唯一索引仍被保留,此时应该先enable在disable.如果原来的状态是able的话,那么唯一索引将被删除.

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn