2013年4月27日 星期六

10:48

1、约束的功能

通过一些强制性商业规则,保证数据的完整性、一致性

2、约束的类别

1 )  not null    不允许为空

    2 )  check       数值类要求       约束该列的值必须满足某种要求

    3 )  unique    唯一

    4 )  primary key (  not null + unique )      非空  唯一  只能有一个主键  唯一标示一行记录

    5 )  foreign key (  reference )              外键    

 【当进行dml操作的时候会检查当前约束是延迟还是非延迟的

  如果是可延迟的约束只有提交的时候才会检查约束】

 

3、约束的状态

 1 )  enable  validate(  默认 )  :【约束会立刻生效,并且 新 旧数据都要符合约束】

SCOTT @ prod > alter table emp1            enable validate constraint  pk_emp1;

alter table emp1

*

ERROR at line 1:

ORA-02437: cannot validate (  SCOTT.PK_EMP1 ) - primary key violated

-----新旧记录都必须符合约束

 2 )  enable novalidate :【约束会立刻生效,只检查新的数据,已经存在的数据可以不符合约束( 注意对primary key 和unique,必须先建立非唯一性索引 )】

SCOTT @ prod > create table emp1 as select * from emp;

Table created.

SCOTT @ prod >  select * from emp1;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 SMITH      CLERK           7902 17-DEC-80        800                    20

7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

7566 JONES      MANAGER         7839 02-APR-81       2975                    20

7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

7839 KING       PRESIDENT            17-NOV-81       5000                    10

7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

7900 JAMES      CLERK           7698 03-DEC-81        950                    30

7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

SCOTT @ prod >  update emp1 set empno=7788 where ename='KING';

1 row updated.

SCOTT @ prod >  select * from emp1 WHERE EMPNO=7788;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

7788 KING       PRESIDENT            17-NOV-81       5000                    10

 添加primary key ,到enable novalidate

SCOTT @ prod > alter table emp1 add constraint     pk_emp1 primary key (  empno ) enable novalidate;           新数据校验  旧的数据不校验  

 

pk_emp1 primary key (  empno ) enable novalidate

*

ERROR at line 2:

ORA-02437: cannot validate (  SCOTT.PK_EMP1 ) - primary key violated

——原因:在建立primary key 它需要建立unique index

——在empno 上建立索引非唯一性索引 )

SCOTT @ prod >  create index       emp1_empno_ind     on    emp1(  empno )        tablespace      indexes;       

Index created.

SCOTT @ prod >  alter table emp1 add constraint                                                                                           

   pk_emp1 primary key (  empno ) using     index     enable    novalidate ;  

Table altered.

——新的记录必须符合约束,旧的不检查

SCOTT @ prod >  update emp1 set empno=7788 where ename='FORD';

update emp1 set empno=7788 where ename='FORD'

*

ERROR at line 1:

ORA-00001: unique constraint (  SCOTT.PK_EMP1 ) violated

SCOTT @ prod > desc  user_constraints ;

SCOTT @ prod > select  constraint_name,constraint_type,status ,validated   from   user_constraints where

Constraint_name=’’;        【检查约束状态】  

3 )  disable validate:  约束失效,但不能做DML操作

4 )  disable novalidate:约束失效,不检查任何数据(  等同于禁用约束 )

4、修正约束将违背约束的记录插入到exceptions表里 )

1 ) SCOTT @ prod >  @?/rdbms/admin/utlexpt1.sql    

SQL> Rem

SQL> Rem $Header: utlexpt1.sql 24-jun-99.07:59:18 echong Exp $

11:47:09 SQL> Rem

11:47:09 SQL> Rem utlexpt1.sql

11:47:09 SQL> Rem

11:47:09 SQL> Rem  Copyright (  c ) Oracle Corporation 1998, 1999. All Rights Reserved.

11:47:09 SQL> Rem

11:47:09 SQL> Rem    NAME

11:47:09 SQL> Rem        utlexpt1.sql - <one-line expansion of the name>

11:47:09 SQL> Rem

11:47:09 SQL> Rem    DESCRIPTION

11:47:09 SQL> Rem        <short description of component this file declares/defines>

11:47:09 SQL> Rem

11:47:09 SQL> Rem    NOTES

11:47:09 SQL> Rem        <other useful comments, qualifications, etc.>

11:47:09 SQL> Rem

11:47:09 SQL> Rem    MODIFIED   (  MM/DD/YY )

11:47:09 SQL> Rem    echong      06/24/99 - rename

11:47:09 SQL> Rem    echong      06/05/98 - exceptions table with urowid type

11:47:09 SQL> Rem    echong      06/05/98 - Created

11:47:09 SQL> Rem

11:47:09 SQL>

11:47:09 SQL> create table exceptions(  row_id urowid,

11:47:09   2                          owner varchar2(  30 ),

11:47:09   3                          table_name varchar2(  30 ),

11:47:09   4                          constraint varchar2(  30 ) );

Table created.                       EXCEPTIONS

SCOTT @ prod > select * from tab;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

DEPT                           TABLE

EMP                            TABLE

BONUS                          TABLE

SALGRADE                       TABLE

ADMIN_EXT_EMPLOYEES            TABLE

EMPLOYEES                      TABLE

TEST                           TABLE

EMP1                           TABLE

EXCEPTIONS                     TABLE

9 rows selected.

SCOTT @ prod > alter table emp1          enable validate constraint   pk_emp1    exceptions     into     exceptions;      【把违背约束的数据插入expections 

alter table emp1

*

ERROR at line 1:

ORA-02437: cannot validate (  SCOTT.PK_EMP1 ) - primary key violated

---------把违背约束的记录插入到exceptions 表里

SCOTT @ prod > select * from exceptions;

ROW_ID                         OWNER                TABLE_NAME                     CONSTRAINT

------------------------------ -------------------- ------------------------------ ------------------------------

AAAM0/AAEAAAAGcAAI             SCOTT                EMP1                           PK_EMP1

AAAM0/AAEAAAAGcAAH             SCOTT                EMP1                           PK_EMP1

SCOTT @ prod > delete from emp1            where rowid in (  select row_id from exceptions );  

2 rows deleted.

SCOTT @ prod >alter table emp1        enable    validate     constraint     pk_emp1;       

Table altered.

5、延迟性约束deferrable(  约束只在提交事务时检查 )   并且回滚事务

SCOTT @ prod > alter table dept1      add constraint pk_dept1 primary key (  deptno );

Table altered.

SCOTT @ prod > alter table emp1    add constraint fk_emp1 foreign key(deptno) references dept1(deptno) deferrable; 

Table altered.

——deferrable 可延迟(默认是immediate ,非 deferr 延迟)

 

SCOTT @ prod >set constraint fk_emp1 deferred;                                                                                          

Constraint set.

---------将约束fk_emp1 进入延迟状态数据可以正常插入但是提交会报错

 

SCOTT @ prod > select * from emp1;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 SMITH      CLERK           7902 17-DEC-80        800                    20

7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

7566 JONES      MANAGER         7839 02-APR-81       2975                    20

7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

7900 JAMES      CLERK           7698 03-DEC-81        950                    30

7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

12 rows selected.

SCOTT @ prod > select * from dept1;

DEPTNO DNAME          LOC

---------- -------------- -------------

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

SCOTT @ prod > update emp1 set deptno=50 where empno=7900;

1 row updated.

SCOTT @ prod > commit;

commit

*

ERROR at line 1:

ORA-02091: transaction rolled back

ORA-02291: integrity constraint (  SCOTT.FK_EMP1 ) violated - parent key not found

SCOTT @ prod > select * from emp1;

EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

7369 SMITH      CLERK           7902 17-DEC-80        800                    20

7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

7566 JONES      MANAGER         7839 02-APR-81       2975                    20

7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

7900 JAMES      CLERK           7698 03-DEC-81        950                    30

7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

12 rows selected.

——【插入记录只在提交(  commit ) 时检查

Alter  table  emp  modify  (  empno  varchar2(6)      not null  )     非空约束

Alter  table  emp  add constraint  constraint_name  unique (  empno )   唯一约束

Alter  table  emp  add constraint  constraint_name  check  (  sal >5000 );

Dba_column_contents    ;          dba_constraints;

添加主键 或是 唯一约束的时候 必须添加 索引

Oracle11g温习-第十四章:约束( constraint )的更多相关文章

  1. Oracle11g温习-第十二章:tables

    2013年4月27日 星期六 10:44 1.表的功能 存储.管理数据的基本单元(二维表:由行和列组成) 2.表的类型  1)普通表:[heap table(堆表) :数据存储时,无序的,对它的访问采 ...

  2. Oracle11g温习-第十九章:审计(audit)

    2013年4月27日 星期六 10:52 1.审计的功能:监控用户在database 的 action (操作) 2.审计分类 1) session :在同一个session,相同的语句只产生一个审计 ...

  3. Oracle11g温习-第十六章:用户管理

    2013年4月27日 星期六 10:50 1.概念 (1)schema : user.object    就是用户创建的对象 (2)用户认证方式:                            ...

  4. JavaScript高级程序设计:第十四章

    第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...

  5. C++ Primer Plus学习:第十四章

    第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...

  6. 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记

    第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...

  7. perl 第十四章 Perl5的包和模块

    第十四章 Perl5的包和模块 by flamephoenix 一.require函数  1.require函数和子程序库  2.用require指定Perl版本二.包  1.包的定义  2.在包间切 ...

  8. Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  9. C和指针 (pointers on C)——第十四章:预处理器

    第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什 ...

随机推荐

  1. Unity3D代码动态修改材质球的颜色

    代码动态修改材质球的颜色: gameObject.GetComponent<Renderer>().material.color=Color.red;//当材质球的Shader为标准时,可 ...

  2. 日系插画学习笔记(一):SAI软件基础

    检测驱动是否安装正确:1.画笔没有压感,线条没有粗细变化2.画笔线条有锯齿 一.文件:新建文件:预设尺寸:一般选择A3(8k),A4(16k),A5(32k)作业要求:A4A5 - 300dpi,像素 ...

  3. XMatch: 您的部门管理助手

    本博客为XMatch项目宣传博客. XMatch: 您的部门管理助手 目录 一.产品概述 二.产品功能 三.产品的创新特色 四.推广方案 五.宣传图 一.产品概述 当前社团的各方面管理工作主要都由手工 ...

  4. SAP S/4 HANA

    通常说到SAP,指的都是SAP Business Suite/R3(ECC) 这款产品. 那么SAP S/4 HANA与SAP R3究竟有什么不同呢? 简单地说,S/4 HANA是下一代的R/3和SA ...

  5. python爬虫训练——正则表达式+BeautifulSoup爬图片

    这次练习爬 传送门 这贴吧里的美食图片. 如果通过img标签和class属性的话,用BeautifulSoup能很简单的解决,但是这次用一下正则表达式,我这也是参考了该博主的博文:传送门 所有图片的s ...

  6. JavaScript中 call和apply

    call()方法和apply()方法的作用相同,他们的区别在于接收参数的方式不同. 对于call(),第一个参数是this值没有变化,变化的是其余参数都直接传递给函数.(在使用call()方法时,传递 ...

  7. JqGrid 自定义子表格 及 自定义Json 格式数据不展示

    项目第一次使用JqGrid ,发现功能强大,但由于对他不熟悉,也没有少走弯路,记录一下. 1.引用 <link href="~/Scripts/JqGrid/jqgrid/css/ui ...

  8. 【Selenium2】【selenium之 定位以及切换frame(iframe)】

    参考:http://blog.csdn.net/huilan_same/article/details/52200586 总有人看不明白,以防万一,先在开头大写加粗说明一下: frameset不用切, ...

  9. CentOS7 使用firewalld打开关闭防火墙以及端口

    1.firewalld的基本使用 启动 systemctl start firewalld 关闭 systemctl stop firewalld 查看状态 systemctl status fire ...

  10. 详细解说Tomcat 设置虚拟路径的几种方法及为什么设置虚拟路径

    说明:此次使用的是Tomcat 7.0 很多朋友都会很疑惑,既然我们都知道在Tomcat服务器上部署项目只要将项目打包,然后放到webapps目录下就可以了,为什么还需要配置虚拟路径?的确,把项目放到 ...