Oracle11g温习-第十四章:约束( constraint )
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
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 > 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 )的更多相关文章
- Oracle11g温习-第十二章:tables
2013年4月27日 星期六 10:44 1.表的功能 存储.管理数据的基本单元(二维表:由行和列组成) 2.表的类型 1)普通表:[heap table(堆表) :数据存储时,无序的,对它的访问采 ...
- Oracle11g温习-第十九章:审计(audit)
2013年4月27日 星期六 10:52 1.审计的功能:监控用户在database 的 action (操作) 2.审计分类 1) session :在同一个session,相同的语句只产生一个审计 ...
- Oracle11g温习-第十六章:用户管理
2013年4月27日 星期六 10:50 1.概念 (1)schema : user.object 就是用户创建的对象 (2)用户认证方式: ...
- JavaScript高级程序设计:第十四章
第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...
- C++ Primer Plus学习:第十四章
第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...
- 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记
第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...
- perl 第十四章 Perl5的包和模块
第十四章 Perl5的包和模块 by flamephoenix 一.require函数 1.require函数和子程序库 2.用require指定Perl版本二.包 1.包的定义 2.在包间切 ...
- Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- C和指针 (pointers on C)——第十四章:预处理器
第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什 ...
随机推荐
- [js] - js中类(伪)数组装正规数组
今天的js中使用了自定义的原型方法去重后,再调用这个获取的去重的数组传入另一个含有for循环的方法时, console.log出错: dimensions:createTime,华联石化,海油石化,青 ...
- 剥开比原看代码13:比原是如何通过/list-balances显示帐户余额的?
作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchai ...
- 设置pip代理
参考: python-proxy-for-pip 设置pip代理 pip install -i http://pypi.douban.com/simple xxx 2018.4
- mysql联合主键自增、主键最大长度小记
前言 一. 联合主键自增问题 今天上午闲来无事翻看了下数据库分类表的设计,看到这样一幕: 当时我好奇的是怎么cateId自增会存在重复值的问题,然后翻看了下主键是由siteId和cateId组成.所以 ...
- RN 使用第三方组件之react-native-image-picker(拍照/从相册获取图片)
首先给个github地址:https://github.com/react-community/react-native-image-picker 英文不行的看下面这个笔记 该插件可以同时给iOS和 ...
- Intellij idea创建maven项目并配置tomcat
今天刷知乎的时候刷到这么一句话 我觉得还是蛮有趣的,形容的也比较到位,正好最近新建maven项目进行了thrift数据的传输,在此做一个记录 首先idea整合了maven,不需要单独下载 新建一个Pr ...
- MYSQL常用函数(系统信息函数)
DATABASE() 返回当前数据库名 BENCHMARK(count,expr) 将表达式expr重复运行count次 CONNECTION_ID() 返回当前客户的连接ID FOUND_ ...
- 多线程工具之CompletionService
这里涉及到Java的多线程并发知识,以及线程池相关的知识.就不在此说明了.具体说说CompletionService的应用场景和使用方法. 比如我们有10个线程需要丢到线程池里面去执行,然后把10个线 ...
- ubuntu解压和压缩文件
.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...
- 常见的ORACLE语句
基本 --新建表: create table table1( id varchar(300) primary key, name varchar(200) not null); --插入数据 inse ...