视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle中CONSTRAINT的四对属性
2020-11-09 11:59:31 责编:小采
文档


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的话,那么唯一索引将被删除.

下载本文
显示全文
专题