首先来看一下《SQL Reference》中对于Constraint的说明:

 
   
 
    下面说一下我的认识:
 
    1、Constraints的目的:
 
      设立Constraint就是为了让数据满足某些规则。
    2、Constraint的类型:
 
      not null    (不能为空)
      unique      (值必须唯一)
      primary key (not null + unique)
      goreign key (该表值必须在外键表中存在)
      check       (自己加的条件)
      ref         (不熟)
    注:Constraints不但可以建立在Table上,也可以建立在View上。
    3、Constraint的状态:
 
      ① Deferrable
      该参数用于指定是否可以是同set语句来进行临时控制constraint,时约束在commit时才生效
      DEFERRABLE:可以使用set constraint字句
      NOT DEFERRABLE:不可以使用set constraint字句(默认)
 
      ② Initially
      该参数用于建立默认的DEFERRABLE类型约束
      INITIALLY一般都要和IMMEDIATE、DEFERRED一起使用
      INITIALLY IMMEDIATE:在执行SQL时违反约束即报错(默认)
      INITIALLY DEFERRED:在提交时才报错
 
      ③ Validate | NoValidate
      该参数一般与Enabled和Disabled属性搭配使用
 
      ④ Enable
      该参数确认约束应用于数据
      ENABLE VALIDATE:将验证已经存在的和之后的操作是否符合约束(默认)
      ENABLE NOVALIDATE:不验证已经存在的数据,但对之后进行的操作有效
 
      ⑤ Disable
      该参数使约束失效
      DISABLE VALIDATE:约束失效标注,可用于暂时导入大量数据时,不进行索引更新
      DISABLE NOVALIDATE:约束失效,并不保证约束是否正确,即不保证已有数据满足约束(默认)
 
      ⑥ Rely
      Rely和Norely只能用在 ALTER TABLE MODIFY constraint 语句中
      Rely:告诉Oracle,不必对NOVALIDATE模式的约束的数据进行信任,即需要检验以前的数据
      (这个没用过,实在搞不准确切含义,还是把文档的内容直接放上来)
     
 
    4、set语句
 
     
 
 
 
----------------------------------------------------------------------------------------------------
转一篇Constraint的文章
----------------------------------------------------------------------------------------------------
 
http://sunmoonking.spaces.live.com/blog/cns!E3BD9CBED01777CA!278.entry
 
constraints 三个需要注意的地方
1. deferrable
一个constraint如果被定义成deferrable那么这个constraints可以在deferred和imediate两种状态相互转换。deferred只在transaction中有效,也就是只可以在transaction过程中使constraint失效,但如果transaction commit的话,transaction会变成immediate。
SQL> create table cons_parent (id number(10),name varchar2(10));
Table created.
SQL> create table cons_child (id number(10),name varchar2(10));
Table created.
SQL> alter table cons_parent add primary key (id);
Table altered.
SQL>alter table cons_child add constraints chi_fk_par foreign key (id)
2   references cons_parent(id);
Table altered.
SQL> alter table cons_child add constraints chi_fk_par foreign key (id)
2 references cons_parent(id);
Table altered.
一个constraint默认是NOT DEFERRABLE的
SQL> select constraint_name||' '||deferrable from all_constraints
2    where constraint_name='CHI_FK_PAR';
CONSTRAINT_NAME||''||DEFERRABLE
---------------------------------------------
CHI_FK_PAR NOT DEFERRABLE
NOT DEFERRABLE的不能在deferred和imediate两种状态相互转换
SQL> set constraints chi_fk_par deferred;
SET constraints chi_fk_par deferred
*
ERROR at line 1:
ORA-02447: cannot defer a constraint that is not deferrable
SQL> alter table cons_child drop constraints chi_fk_par;
Table altered.
SQL> alter table cons_child add constraints chi_fk_par foreign key (id)
2    references cons_parent(id) deferrable;
Table altered.
SQL> select constraint_name||' '||deferrable from all_constraints
2    where constraint_name='CHI_FK_PAR';
CONSTRAINT_NAME||''||DEFERRABLE
---------------------------------------------
CHI_FK_PAR DEFERRABLE
一个constraint如果被定义成deferrable那么这个constraints可以在deferred和imediate两种状态相互转换
SQL> set constraints chi_fk_par immediate;
Constraint set.
SQL> insert into cons_child values (2,'llll')
insert into cons_child values (2,'llll')
*
ERROR at line 1:
ORA-02291: integrity constraint (SYSTEM.CHI_FK_PAR) violated - parent key not found
SQL> set constraints chi_fk_par deferred;
Constraint set.
SQL> insert into cons_child values (2,'llll');
1 row created.
SQL> set constraints chi_fk_par immediate;
SET constraints chi_fk_par immediate
*
ERROR at line 1:
ORA-02291: integrity constraint (SYSTEM.CHI_FK_PAR) violated - parent key not found
deferred只在transaction中有效,也就是只可以在transaction过程中使constraint失效,但如果transaction commit的话,transaction会变成immediate。
SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02291: integrity constraint (SYSTEM.CHI_FK_PAR) violated - parent key not found
deferrable会影响CBO的计划,并且正常情况下没有应用的必要,所以建议不要修改,而用系统默认的non deferrable

2. enable/disable validate/novalidate
enable/disable对未来的数据有约束/无约束。
validate/novalidate对已有的数据有约束/无约束。
如果加约束到一个大表,那么ORACLE会LOCK这个表,然后SCAN所有数据,来判断是否符合CONSTRAINT的要求,在繁忙的系统里显然是不合适的。所以用enable novalidate比较合适,因为ORACLE仅仅会LOCK表一小段时间来建立CONSTRAINT,当CONSTRAINT建立后再VALIDATE,这时检验数据是不会LOCK表的。
这方面很多书上都有例子,就不在这里累述了

3.REFERENCE 让人疑惑的地方
SQL>  create table wwm_father (id number,name varchar2(10),primary key (id,name))
Table created.
SQL> create table wwm_child (id number,name varchar2(10),
2    foreign key (id,name) references wwm_father on delete set null);
Table created.
SQL> insert into wwm_father values (6,'wwm');
1 row created.
SQL> insret into wwm_child values (6,'fff');
SP2-0734: unknown command beginning "insret int..." - rest of line ignored.
可以看出,REFERENCE是起作用的。但下面就有点让人疑惑了,似乎ORACLE不用该用这种策略来做,
SQL> insert into wwm_child values (6,null);
1 row created.
SQL> insert into wwm_child values(null,'lll');
1 row created.
SQL> insert into wwm_child values (null,null);
1 row created.
SQL> select * from wwm_father;
ID NAME
---------- --------------------
6 wwm
SQL> select * from wwm_child;
ID NAME
---------- --------------------
6
lll
SQL> select count(*) from wwm_child;
COUNT(*)
----------
3
可见,如果向CHILD表插入NULL的话,ORACLE默认认为NULL是匹配FATHER表里相关的REFERENCE的字段内容的。因此FOREIGN KEY的COLUMN大家就需要认真考虑是否要设置成NOT NULL了

Oracle里面constraint说明相关推荐

  1. ORACLE中CONSTRAINT的四对属性

    ORACLE中CONSTRAINT的四对属性 summary:在data migrate时,某些表的约束总是困扰着我们,让我们的migratet举步维艰,怎样利用约束本身的属性来处理这些问题呢?本文具 ...

  2. 默认约束 oracle,ORACLE约束(constraint):对象的强制规定

    ORACLE约束(constraint):对象的强制规定 5种约束: NOT NULL     非空 NN UNIQUE       唯一 UK PRIMARY KEY  主键 PK FOREIGN ...

  3. oracle Deferrable constraint 详解以及用法.

    1. 两种验证时机. Oracle的constraints(约束) 根据验证时机可以分成两种. case 1.  在每一句insert statement 执行时就会马上验证, 如果约束验证失败,  ...

  4. Oracle中Constraint的状态参数initially与deferrable

    在Oracle数据库中,关于约束的状态有下面两个参数:             initially (initially immediate 或 initially deferred)         ...

  5. oracle中constraint的使用,constraint用法总结 I .

    Oracle中的约束简单介绍 约束 Including Constraints 在数据库中使用约束(constraints)是为了在该数据库中实施所谓的"业务规则"其实就是防止非法 ...

  6. 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated

    ALTER TABLE table_name DISABLE CONSTRAINT constraint_name; select * from all_constraintswhere owner ...

  7. Oracle 约束 Constraint

    约束简介 约束用于确保数据库数据满足特定的商业逻辑或者企业规则,如果定义了约束,并且数据不符 合约束,那么DML操作(INSERT.UPDATE.DELETE)将不能成功执行.约束包括NOT NULL ...

  8. oracle怎么关闭约束,Oracle约束enable/disablenovalidate

    oracle 对constraint的开启和关闭共有四种:enable validate;enable novalidate;disable validate;disable novalidate.启 ...

  9. constraint PK_LDBACKUPTEXTINFO primary key (xx) using index tablespace lisi

    Oracle数据库 constraint xx primary key(xx) 创建主键的方式 constraint TF_B_AIR_CONFIG_PK primary key(TYPE_ID)–单 ...

最新文章

  1. 计算机vb2级知识点,二级考试(VB)知识点细化(针对浙江省计算机等级考试)
  2. mysql.msi卸载_MySql安装与卸载的详细教程
  3. 金猪钱罐——青龙羊毛
  4. git提交代码,合并同步分支
  5. Java入门系列-11-类和对象
  6. Eclipse配置Tomcat服务器,通用方法
  7. 【王俊杰de人工智能实战课】第7次作业2
  8. python安装robotframework报错_Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
  9. 基于windows server 2008 web服务器的性能,使用Windows Server 2008 R2理由_服务器评测与技术-中关村在线...
  10. mkdir 创建多级目录_Linux mkdir命令:创建目录(文件夹)
  11. PHP面试常考内容之面向对象(3) 1
  12. 虚拟机安装Windows7镜像
  13. 计算机取证程序论文,计算机取证论文参考文献推荐 计算机取证论文参考文献哪里找...
  14. android仿微信播放视频播放器,vue DPlayer 仿微信朋友圈视频播放效果
  15. ipad文献管理软件_ipad和电脑双向同步文献的奥秘
  16. D*(Dynamic A*) 算法详细解析
  17. CCS安装失败的原因
  18. 高精度地图-黑客又要开始装逼了!
  19. vue取数据库中的数据_Vue 数据怎么获取使用外部的数据
  20. 教你用Python写界面

热门文章

  1. Air700E开发板|移芯EC618|4G Cat.1模组:概述及PinOut
  2. python datetime需要安装_Python全栈工程师学习笔记 | Django的模型层
  3. Web前端培训项目实战—华为荣耀商城
  4. 基于Unity3D三维模型的动作插值(空间关键帧动画实现)
  5. TryHackMe | Blue Writeup (超干货详细msf渗透使用指南)
  6. 解决云开会难题,英特尔联合腾讯会议打造“会开会”的会议室
  7. NGUI HUD text 代码示例
  8. C语言中自定义函数返回数组类型
  9. HTML5超炫酷特效【天空中白云飘动CSS3特效】HTML+CSS+JavaScript
  10. 锐捷交换机配置SSH