ORACLE中CONSTRAINT的四对属性

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

 

 

5.    报告约束异常

假设校验约束时存在异常,则返回一个错误,且完整性约束仍保持未被校验状态。当约束存在异常时,一个语句就不能正确运行,则此语句被回滚。假设存在异常,必需要更新或删除了约束的全部异常后,才干够校验约束。可是在使用ALTER TABLE语句不能确定哪一行违反约束,为了确定哪一行,在公布ENABLE子句中带有EXCEPTION选项的ALTER TABLE语句。

EXCEPTION选项将ROWID、OWNER、TABLE、ROWID、CONSTRAINT放到一个指定的表中。在启用约束前,硬创建一个合适的异常报告表,用来接收ENABLE子句的EXCEPTION选项信息,能够直接运行'?\rdbms\admin\utlexcpt.sql'或'?\rdbms\admin\utlexcpt1.sql'脚本来进行创建。注意:这两个脚本的差别在于数据库的兼容性级别和所分析的表的类型。

使用的语法例如以下:

ALTER TABLE dept ENABLE PRIMARY KEY EXCEPTIONS INTO EXCEPTIONS;

或者

alter table team disable validate   constraint id_num   EXCEPTIONS INTO EXCEPTIONS;--这种方法不创建索引

假设存在异常,则直接查询 SELECT * FROM EXCEPTIONS; 就可以。假设须要更加具体的信息,则能够使用ROWID与原表的ROWID进行关联,这样就能够查出原始表中当前行的全部信息,并进行改动。

怎样利用EXCEPTIONS来处理实践中的一些问题:

(1)在已有的constraint上载入数据

先 disable

再载入

再enable and EXCEPTIONS INTO EXCEPTIONS

再依据EXCEPTIONS表的纪录delete

最后enable

(2)新建constraint,原有的数据违反了这个约束

先create disable

再enable and EXCEPTIONS INTO EXCEPTIONS

      下面是一个新建外键的样例

alter table team add constraint id_num foreign key(id)  references games(scores) INITIALLY disable; 


   alter table team enable   constraint id_num   EXCEPTIONS INTO EXCEPTIONS;           select * from EXCEPTIONS;

6.     关于contraint操作的一些脚步

定义约束

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

alter table t add constraint ch_100  unique(id);

        alter table t add constraint ch_100  unique(id) deferred deferrable novalidate;

CREATE TABLE dept_20

(employee_id     NUMBER(4),

commission_pct  NUMBER(7,2),

department_id,

CONSTRAINT fk_deptno

FOREIGN  KEY (department_id)

REFERENCES  departments(department_id)

on delete/set null cascade);

ALTER TABLE dept_20

ADD CONSTRAINT fk_empid_hiredate

FOREIGN KEY (employee_id, hire_date)

REFERENCES hr.job_history(employee_id, start_date)

EXCEPTIONS INTO EXCEPTIONS;

CREATE TABLE divisions

(div_no    NUMBER  CONSTRAINT check_divno

CHECK (div_no BETWEEN 10 AND 99)

DISABLE,

div_name  VARCHAR2(9)  CONSTRAINT check_divname

CHECK (div_name = UPPER(div_name))

DISABLE,

office    VARCHAR2(10)  CONSTRAINT check_office

CHECK (office IN ('DALLAS','BOSTON',

'PARIS','TOKYO'))

DISABLE);

 

 

改动或删除现有的约束

注:在使用外键參考了PRIMARY或UNIQUE键时,不能停用或删除被參考约束

延迟校验的启用停用:

SET CONSTRAINT(s) unq_num/all immediate;

SET CONSTRAINT(s) unq_num/all deferred;

停用:

ALTER TABLE dept DISABLE CONSTRAINT dname_ukey;

ALTER TABLE dept DISABLE PRIMARY KEY KEEP INDEX,

DISABLE UNIQUE (dname, loc) KEEP INDEX;

启用非校验:

ALTER TABLE dept ENABLE CONSTRAINT dname_ukey;

ALTER TABLE dept ENABLE NOVALIDATE PRIMARY KEY,

ENABLE NOVALIDATE UNIQUE (dname, loc);

启用校验:

ALTER TABLE dept MODIFY CONSTRAINT dname_ukey VALIDATE;

ALTER TABLE dept MODIFY PRIMARY KEY ENABLE NOVALIDATE;

若要停用/删除相关的FOREIGN KEY约束,则:

ALTER TABLE dept DISABLE PRIMARY KEY CASCADE;

删除:

ALTER TABLE dept DROP UNIQUE (dname, loc);

ALTER TABLE emp DROP PRIMARY KEY KEEP INDEX,

DROP CONSTRAINT dept_fkey;

ORACLE中CONSTRAINT的四对属性的更多相关文章

  1. C#中datagridviewz中SelectionMode的四个属性的含义

    C#中datagridviewz中SelectionMode的四个属性的含义 DataGridViewSelectionMode.ColumnHeaderSelect 单击列头就可以选择整列DataG ...

  2. SQL server中事务的四个属性特征(ACID)

    事务的概念.类型和四个特征(ACID). 1.事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Se ...

  3. jsp中提供的四种属性范围

    参考:http://www.cnblogs.com/xdp-gacl/p/3781056.html 1.当前页:一个属性只能在一个页面中取得,跳转到其他页面无法取得 2.一次服务器请求:一个页面中设置 ...

  4. JSP中四种属性保存范围(1)

    一.四种属性范围 在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效request:在一次服务请求范围内,服务器跳转后依然有效session:-在一次会话范围内,无论何种跳 ...

  5. JSP九大内置对象和四种属性范围解读

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文首先主要解说了JSP中四种属性范围的概念.用法与实例. 然后在这个基础之上又引入了九 ...

  6. Jsp学习总结(1)——JSP九大内置对象和四种属性范围解读

    一.四种属性范围 1.1.在JSP中提供了四种属性保存范围 page:在一个页面内保存属性,跳转之后无效 request:在一次服务请求范围内,服务器跳转后依然有效 session:-在一次会话范围内 ...

  7. oracle中如何更改一个表的一个字段属性(名称,类型)

    修改字段的属性,名称方法 --修改某一个字段的类型,当该字段不为null时alter table 表名add 字段NUMBER(11,0) default 0 not null;--添加表一个字段 A ...

  8. css样式表中四种属性选择器

    学习此连接的总结http://developer.51cto.com/art/201009/226158.htmcss样式表中四种属性选择器1> 简易属性 tag[class]{ font-we ...

  9. 在mysql数据库中创建oracle scott用户的四个表及插入初始化数据

    在mysql数据库中创建oracle scott用户的四个表及插入初始化数据 /* 功能:创建 scott 数据库中的 dept 表 */ create table dept( deptno int ...

随机推荐

  1. 利用ioctl()获取无线速率

    其实对于自己装了网卡驱动的来说,应该从最根本的驱动中获取速率. 但是用ioctl()也可以,其实实现和iwconfig命令相同. 仅仅获取速率这部分: #include <stdio.h> ...

  2. 使ViewFlipper中的WebView实现手势效果

    使ViewFlipper中的WebView实现手势效果   今天写Blog阅读器的时候遇到了这个问题,把它分享给大家,让同样是新手们少走冤枉路始初写这个功能的时候,用过了好多方法,也耗了不少时间去研究 ...

  3. IOS color 颜色值比较

    /生成采样对照颜色(黑色) UIColor* sampleColor = [UIColor colorWithRed:(0/255.0f) green:(0/255.0f)  blue:(0/255. ...

  4. 【ActiveX】实现安全接口

    转自:http://www.cnblogs.com/carekee/articles/1772201.html 感谢原作者! ActiveX控件打包成cab后,在脚本中调用中时,要保证控件的安全性才能 ...

  5. cocos2d-x知识巩固-基础篇(1)

    有段时间没有学习cocos2dx了,作为新人,自己觉得还是要稳扎稳打,一点点的去积累,梳理好每一个知识点,这样对自己的成长能够有一个更清晰的认识,以便做更好的提高. 从2013年8月开始接触cocos ...

  6. 数字图像处理-----主成成分分析PCA

    主成分分析PCA 降维的必要性 1.多重共线性--预测变量之间相互关联.多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯. 2.高维空间本身具有稀疏性.一维正态分布有68%的值落于正负标准差之 ...

  7. Linux 中 x86 的内联汇编

    工程中需要用到内联汇编,找到一篇不错的文章,趁机学习下. 原文地址:http://www.ibm.com/developerworks/cn/linux/sdk/assemble/inline/ 如果 ...

  8. .net中的"异步"-手把手带你体验

    周二刚过,离5.1小长假还有那么一阵,北京的天气已经开始热起来了.洗完澡,突然想起博客园一位大哥暂称呼元哥吧,当时我写了一篇windows服务的安装教程(http://www.cnblogs.com/ ...

  9. matplotlib绘制三维图

    本文参考官方文档:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html 起步 新建一个matplotlib.figure.Figure对象, ...

  10. [POJ] #1001# Exponentiation : 大数乘法

    一. 题目 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156373   Accepted: ...