Oracle约束详解
一 约束的定义
约束是强加在表上的规则或条件。确保数据库满足业务规则。保证数据的完整性。当对表进行DML或DDL操作时,如果此操作会造成表中的数据违反约束条件或规则的话,系统就会拒绝执行这个操作。约束可以是列一级别的 也可以是表级别的。定义约束时没有给出约束的名字,ORACLE系统将为该约束自动生成一个名字,其格式为SYS_Cn,其中n为自然数(强烈建议各位在创建表或增加约束时,给约束定义名称。)
在ORACLE中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。
列级约束:
列级定义是在定义列的同时定义约束;
column [CONSTRAINT constraint_name] constraint_type
表级约束:
表级定义是指在定义了所有列后,再定义约束,这里需要注意,not null约束只能在列级上定义;
column ,...,
[CONSTRAINT constraint_name] constraint_type (column,...)
二 约束功能
约束的功能:实现一些业务规则,防止无效的垃圾数据进入数据库,维护数据库的完整性(完整性指正确性与一致性)。从而使数据库的开发和维护都更加容易。
三 约束的分类
1 not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供,数据不能为NULL。约束只能在列级定义,不能在表级定义。
2 unique(唯一)
当定义了唯一约束后,该列值是不能重复的,但是可以为null。
3 primary key(主键)
用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为NULL。一张表最多只能有一个主键,但是可以由多个unique约束。
创建主键或唯一约束后,ORACLE会自动创建一个与约束同名的索引(UNIQUENES为UNIQUE唯一索引)。需要注意的是:每个表只能有且有一个主键约束。
4 foreign key(外键)
用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。
用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。例如在数据仓库中,就推荐禁用外键约束。
5 check
用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在1000~2000之间就会提示出错。
四 约束命令规范
约束名称建议自己定义一套命名规则,否则使用系统生成的约束名,很难能把它和对应的表、字段联系起来。
非空约束 NN_表名_列名
唯一约束 UK_表名_列名
主键约束 PK_表名
外键约束 FK_表名_列名
条件约束 CK_表名_列名
默认约束 DF_表名_列名
如果约束名称超过32位长度,建议应该缩写表名,而不应用NN_表名_数字。不过具体视情况而定,很多时候 DF_表名_列名 这样命名,往往超出了32字符。所以有时候需要缩写表面或是采用其它规则。
五 创建约束
1 not null(非空)
方法一:
SQL> create table t1(id number,name varchar2(20) constraint nn_t1_id not null);
SQL> select constraint_name,constraint_type,owner from user_constraints;
CONSTRAINT_NAME C OWNER
------------------------------ - ----------
NN_T1_ID C SCOTT
方法二:
SQL> drop table t1 purge;
SQL> create table t1(id number,name varchar2(20));
SQL> alter table t1 modify id constraint nn_t1_id not null;
SQL> select constraint_name,table_name,owner from user_constraints;
CONSTRAINT_NAME TABLE_NAME OWNER
------------------------------ ------------------------------ ----------
NN_T1_ID T1 SCOTT
2 unique(唯一)
方法一:
SQL> create table t1(id number,qq number,constraint un_t1_qq unique(qq));
方法二:
SQL> alter table t1 add constraint un_t1_qq unique(qq);
3 primary key(主键)
方法一:
SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id));
方法二:
SQL> alter table t1 add constraint pk_t1_id primary key(id);
SQL> select constraint_name,table_name,owner from user_constraints;
CONSTRAINT_NAME TABLE_NAME OWNER
------------------------------ ------------------------------ ----------
PK_T1_ID T1 SCOTT
4 foreign key(外键)
方法一:
SQL> create table t2(id number,cc number,constraint fk_t2_id foreign key(id) references t1(id));
方法二:
SQL> alter table t1 add constraint pk_t2_id foreign key(id) references t1(id);
SQL> select constraint_name,table_name,owner from user_constraints;
CONSTRAINT_NAME TABLE_NAME OWNER
------------------------------ ------------------------------ ----------
PK_T1_ID T1 SCOTT
PK_T2_ID T1 SCOTT
当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或惟一列)中存在,或者为NULL,FOREING KEY约束既可以在列级定义,也可以在表级定义。
关键字说明:
(1) FOREING KEY:该选项用于指定在表级定义外部键约束。当在表级定义外部键约束时必须指定该选项,在列级定义外部键约束不需要指定该选项
(2) REFERENCES:该选项用于指定主表名及其主键列。当定义外部键约束时,该选项必须指定。
(3) ON DELETE CASCAED:该选项用于指定级联删除选项。如果在定义外部键约束时指定了该选项,那么当删除主表数据时会级联删除从表的相关数据。
(4) ON DELECT SET NULL:该选项用于指定转换相关的外部键值为NULL,如果在定义外部键约束时指定了该选项,那么当删除主表数据时会将从表外部键列的数据设置为NULL。
SQL> create table t1(id number,qq number,constraint pk_t1_id primary key(id));
SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id));
SQL> delete t1; ----由于主外键约束,无法删除主表
delete t1
*
ERROR at line 1:
ORA-02292: integrity constraint (SYS.FK_T2_ID) violated - child record found
SQL> insert into t2 values(2,2); ---由于主外键的约束,无法在外键表插入主键中id列没有的值
insert into t2 values(2,2)
*
ERROR at line 1:
ORA-02291: integrity constraint (SYS.FK_T2_ID) violated - parent key not found
SQL> delete t2;
1 row deleted.
SQL> rollback;
SQL> drop table t2 purge;
SQL> create table t2(id number,sal number,constraint fk_t2_id foreign key(id) references t1(id) on delete cascade); -----外键表添加级联删除参数
SQL> delete t1; ----删除主键表上的数据,级联删除外键表上的数据
1 row deleted.
SQL> select * from t1;
no rows selected
SQL> select * from t2;
no rows selected
5 check(检查性约束)
方法一:
SQL> create table t3(id number,sal number,constraint ck_t3_sal check(sal between 5000 and 50000));
SQL> select constraint_name,table_name,owner from user_constraints;
CONSTRAINT_NAME TABLE_NAME OWNER
------------------------------ ------------------------------ ----------
CK_T3_SAL T3 SCOTT
方法二:
SQL> create table t3(id number,sal number);
SQL> alter table t3 add constraint ck_t3_sal check(sal>5000);
六 维护约束
1 增加约束
(1) 如果增加UNIQUE、PRIMARY KEY、FOREIGN KEY 和CKECK 必须使用ALTER TABLE语句的ADD子句;
(2) 如果增加NOT NULL约束,那么必须使用ALTER TABLE语句的MODIFY子句,如:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
constraint_type (column,...)
ALTER TABLE table_name MODIFY column
[CONSTRAINT constraint_name] NOT NULL;
2 修改约束名
在同一个方案中,约束名必须惟一,并且约束名也不能与其他对象同名。当用IMPDP工具或者IMP工具导入其他对象时,如发现有同名的对象,将会出错
语法:
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name
TO new_constraint_name;
例:
ALTER TABLE emp01 RENAME CONSTRAINT SYS_C005028
TO ck_emp01_salary;
SQL> alter table t1 rename constraint PK_T1_ID to new pk01_t1_id;
alter table t1 rename constraint PK_T1_ID to new pk01_t1_id
*
ERROR at line 1: --------主键无法更改名字
ORA-23290: This operation may not be combined with any other operation
SQL> alter table t2 rename constraint fk_t2_id to fk01_t2_id;
SQL> select constraint_name,table_name from user_constraints where table_name='T2';
CONSTRAINT_NAME TABLE_NAME
------------------------------ ------------------------------
FK01_T2_ID T2 -------------外键可以更改名字
SQL> alter table t1 add constraint un_t1_qq unique(qq);
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
CONSTRAINT_NAME TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID T1
UN_T1_QQ T1
SQL> alter table t1 rename constraint un_t1_qq to un01_t1_qq;
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
CONSTRAINT_NAME TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID T1
UN01_T1_QQ T1
3 禁止约束
禁止约束指使约束临时失效。当禁止了约束之后,约束规则将不再生效。在使用SQL*LOADER或INSERT装载数据之前,为了加快数据装载速度,应该首先禁止约束,然后装载数据。
语法:
ALTER TABLE table_name
DISABLE CONSTRAINT constaint_name [CASCAED];--CASCAED用于指定级联禁止从表的外部键
SQL> insert into t2 values(2,2);
insert into t2 values(2,2)
*
ERROR at line 1:
ORA-02291: integrity constraint (SYS.FK01_T2_ID) violated - parent key not
found
SQL> alter table t2 disable constraint fk01_t2_id;
Table altered.
SQL> insert into t2 values(2,2);
1 row created.
4 激活约束
语法:
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
例:
SQL> alter table t2 enable constraint fk01_t2_id;
alter table t2 enable constraint fk01_t2_id
*
ERROR at line 1: ---外键激活失败,原因是在外键表中含有主键表中没有的数据
ORA-02298: cannot validate (SYS.FK01_T2_ID) - parent keys not found
SQL> delete t2 where id=2; -------删除数据
SQL> alter table t2 enable constraint fk01_t2_id; ----激活成功
5 删除约束
当删除特定表的主键约束时,如果该表具有相关的从表,那么在删除主键约束时必须带有CASCAED选项
语法:
ALTER TABLE table_name DROP
CONSTRAINT constraint_name |PRIMARY KEY
例一:(删除唯一性约束)
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
CONSTRAINT_NAME TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID T1
UN01_T1_QQ T1
SQL> alter table t1 drop constraint un01_t1_qq;
Table altered.
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
CONSTRAINT_NAME TABLE_NAME
------------------------------ ------------------------------
PK_T1_ID T1
例二:(删除主键约束,级联删除外键约束)
SQL> alter table t1 drop primary key cascade;
Table altered.
SQL> select constraint_name,table_name from user_constraints where table_name='T2';
no rows selected
SQL> select constraint_name,table_name from user_constraints where table_name='T1';
no rows selected
6 显示信息
1.USER_CONSTRAINTS
2.USER_CONS_COLUMNS
SQL> select constraint_name,table_name,column_name from user_cons_columns where table_name='T1';
CONSTRAINT_NAME TABLE_NAME COLUM
------------------------------ ------------------------------ -----
UN_T1_ID T1 ID
Oracle约束详解的更多相关文章
- Oracle数据字典详解
学习笔记:oracle数据字典详解 --- 本文为TTT学习笔记,首先介绍数据字典及查看方法,然后分类总结各类数据字典的表和视图.然后列出一些附例. 数据字典系统表,保存在system表空间中. ...
- 【Oracle】详解ORACLE中的trigger(触发器)
本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...
- 问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例
ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创 ...
- (转)oracle视图详解
Oracle视图详解 一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的.视图只有逻辑定义.每次使用的时候,只是重新执 ...
- oracle 数据类型详解---日期型(转载)
oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...
- oracle 序列 详解
序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l 自动提供唯一的数值 l 共享对象 l 主要用于提供主键值 l 将序列值装入内存可以提高访问效率 创建序列: 1. 要有创建 ...
- oracle checkpoint 详解
Oracle checkpoint详解 topcheckpoint扫盲 top什么是checkpoint 在数据库系统中,写日志和写数据文件是数据库中IO消耗最大的两种操作,在这两种操作中写数据文件属 ...
- oracle rowid 详解
oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...
- Oracle索引详解
Oracle索引详解(二) --索引分类 Oracle 提供了大量索引选项.知道在给定条件下使用哪个选项对于一个程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程 ...
随机推荐
- 构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)
构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study ...
- 20145221 《Java程序设计》第一周学习总结
20145221 <Java程序设计>第一周学习总结 教材学习内容总结 第一周内容已在假期完成,详见博客: Hello Java! 开源中国的代码托管 代码调试中的问题和解决过程 第一周内 ...
- 初识PHP(四)PDO对象配置于使用
一.PDO的概念 PDO其实就是一个数据库的抽象层,使用PDO编程可以方便的在之后的实际运营中随时更改数据库而不用变更源代码.PDO的位置如下图所示: 二.PDO的开启 PDO需要使用php 5.1 ...
- Redis哨兵(sentinel)
介绍 Redis的sentinel主要是用来管理多个Redis服务器,sentinel负责(1)监控主服务器和从服务器的运行状态(2)主服务器运行故障时自动切换其中一台从服务器为主服务器 Sentin ...
- install ros-indigo-tf2
sudo apt-get install ros-indigo-tf2
- 《F4+2》——团队项目的原型设计与开发
目 录 1 · 团队信息 2 · NABCD模型 3. 原型设计的工具 4 · 原型设计 5 · PSP表格 6 · 团队设计过程 7 · 原型设计心得 一 · 团 队 信 息 成 员 列 ...
- SpringBoot在启动时的多环境配置以及加载顺序
通常我们在开发完成一个SpringBoot项目时,总是要打包部署的. 在启动SpringBoot应用时,我们常常会使用命令java -jar xxx.jar来启动这个服务. 命令java -jar 除 ...
- Android之扫描二维码和根据输入信息生成名片二维码
开发中常常遇到二维码扫码操作,前段时间做项目要实现该功能,于是网上查找资料实现了,现在把他做出来给各位分享一下,主要包含了二维码扫描和生成二维码名片. 先来看看效果图: 生成的二维码,打开微信扫一 ...
- 获取div的高度
1.获取div的文档总高度(必须DOM操作): var scrollHeight=document.getElementById("inner").scrollHeight; // ...
- XML——概述
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...