Oracle约束简介

整理自《OCP认证指南》
001 概述

    表约束是数据库能够实施业务规则以及保证数据遵循实体——关系模型的一种手段,其中,实体——关系模型由定义应用程序数据结构的系统分析所确定。

    在针对定义了约束的表执行任何DML时,如果DML违反了约束,则将自动回滚整个语句。注意,如果一个DML语句影响到多个行,那么,在特定行遇到约束问题前,此语句可能已经局部成功。如果此语句是多语句事务的一部分,那么,事务中已经成功语句将保持完好,但不提交。

    考点:如果违反约束,将自动回滚出现问题的整个语句,而不是语句中的单个操作,也不是整个事务。

002 约束类型

    Oracle数据库支持的约束类型如下:

    ·unique

    ·not Null

    ·primary key

    ·foreign key

    ·check

    约束具有名称。最好使用标准命名约定指定名称,如果未显式指定名称,Oracle将为其生成名称。

003 unique约束

    unique约束要求,对于列或列组合而言,表中每行的值必须是不同的。如果此约束针对单个列,则相应的列称为键(key)列。如果约束由多列组成(称为组合键唯一约束),这些列并不必是相同的数据类    型,也不必在表定义中互相邻近。

    unique约束的怪异之处在于,可以在键列中输入Null值。在键列中,可能有任意数量的包含Null值的行。因此,如果不搜索Null,则可以确保在键列上选择时将仅返回一行;如果搜索Null,那么,键列为Null的所有行都将返回。

    考点:对于具有unique约束的列,可以插入多个包含Null的行,而对于包含primary key约束的列而言,则不存在这种可能性。    

    unique约束通过索引来实施。在定义unique约束时,Oracle将查看键列上的索引,如果不存在,就创建一个。此后,每次插入行时,Oracle都将查看索引,了解键列的值是否已经存在。如果已存在,则将拒绝插入。这些索引(称为B*树索引)的结构不包含Null值,正因为如此,才允许出现多个包含Null的行:索引中根本不存在Null。虽然索引的第一要务是实施约束,但也有次生效应:如果在SQL语句的where子句中使用键列,性能将会提高。但是,选择where key_column IS Null则不使用索引(因为它不包括Null),因此总是导致扫描整个表。

004 NOT Null约束

    not Null约束强制在键列中输入值。它针对每个列进行定义,有时被称为强制列(mandatory column)。如果业务要求一组列都具有值,则不能为整个组定义not Null约束 ,而必须针对每列定义not Null约束。

    如果尝试插入没有为具有not Null约束的列指定值的行,将导致错误。不懂?????


005 primary key约束

    主键(primary key)定位表中单个行的方式。关系数据库范例要求每个表都必须有主键,主键是用于区分每行的列或列组合。Oracle数据库的定义与此范例有所不同,它允许存在不包含主键的表。

    主键约束的实现实际上是unique和not Null约束的组合。键列必须具有唯一值,而且不得为空。与unique约束一样,约束列上必须存在索引。如果不存在,将在定义约束时创建索引。一个表只能有一个主键,试着创建第二个,将出现错误。但是,表可以有任意数量的unique和not Null约束列。

    考点:unique和primary key约束需要索引。如果不存在,就会自动予以创建。

006 foreign key约束

    在父子关系的子表中定义foreign key约束。此约束使子表中的列(或列组合)对应父表的主键列。这些列不必同名,但数据类型必须相同。foreign key约束定义数据库的关系结构:连接第三范式的表的多对一关系。

    如果父表具有unique和/或primary key约束,则这些列可用作foreign key约束的基础,即使允许使用Null值,也是如此。

    考点:外键约束在子表上定义,但此时的父表上必须存在unique或primary key约束。

    unique约束允许约束列中出现Null值,foreign key约束也同样如此。即使父表的行中不存在Null,也可以将行插入到包含Null外键列的子表中。这会创建孤行,并产生令人不快的混乱。一般而言,unique约束中的所有列以及foreign key约束中的所有列最好也定义not Null约束,这往往是业务要求。

    尝试在子表中插入父表中没有匹配行的行,将生成错误。同样,如果父表中的某行在子表中已有引用它的行,则删除相应的行将引发错误。可以使用两种技术来更改此行为。首先,可将此约束创建为on delete cascade。这意味着,如果删除父表中的行,那么Oracle将在子表中搜索所有匹配行,并删除它们。这将自动发生。一个较温和的技术是将约束创建为on delete set null。在此情况下,如果删除父表中的行,Oracle将在子表中搜索所有的匹配行,并将外键列设为空。这意味着,子行将称为孤行,但依然存在。如果子表中的列也有not Null约束,则父表上的删除操作将失败。

    即使子表中没有行,也不能删除或截断外键关系中的父表。如果使用on delete set Null或on delete cascade子句,这依然适用。

    foreign key约束的一个变体是自引用foreign key约束。这将定义一个条件,其中的父行和子行存在于同一个表中。

007 check约束

    check约束可用来实施简单规则,如列中输入的值必须在一个值域内。规则必须是一个结构为true或false的表达式。规则可以引用作为字面值输入的绝对值,也可以引用同一行中的其它列,也可以使用一些函数。可以根据需要为一个列应用足够多的check约束,但无法使用子查询来计算值是否被允许,也无法使用诸如sysdate等函数。

    提示:not Null约束实际上作为预配置check约束实现。

时间: 2024-09-15 22:54:41

Oracle约束简介的相关文章

Oracle Spatial 简介

oracle Oracle Spatial 简介:        首先,Oracle 支持自定义的数据类型,你可以用数组,结构体或者带有构造函数,功能函数的类来定义自己的对象类型.这样的对象类型可以用于属性列的数据类型,也可以用来创建对象表.而Oracle Spatial也正是基于此种特性所开发的一套空间数据处理系统.        Spatial 的自定义数据类型有很多,都在MDSYS方案下,经常使用的是SDO_GEOMETRY类型.SDO_GEOMETRY表示一个几何对象,可以是点.线.面.

ORACLE约束总结

你对ORACLE约束的了解如何?比较模糊还 是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本ORACLE是否不同)?视图有约束吗?约束是否会影响SQL性能? 约束信息存储在哪些系统视图.数据字典中?约束能否修改名称?能否禁用约束?延迟约束有啥好处.......   约束定义 约束是强加在表上的规则或条件.确保数据库满 足业务规则.保证数据的完整性.当对表进行DML或DDL操作时,如果此操

Oracle约束管理脚本_oracle

正在看的ORACLE教程是:Oracle约束管理脚本.作为一个Oracle数据库管理员,会碰到这样的数据库管理需求,停止或者打开当前用户(模式)下所有表的约束条件和触发器.这在数据库的合并以及对数据库系统的代码表中某些代码的修改时需要做的工作之一.  我们来看这样一种实际数据库工作业务需求,这在目前的许多应用中是非常实际的.某地区银行数据,目前采用市级数据集中,随着计算机网络技术的不断提高以及对服务水平的要求,提出了省级乃至国家级的数据集中.除了应用需要修改以外,对于数据库管理员来讲,最重要的工

Oracle约束管理脚本

作为一个Oracle数据库管理员,会碰到这样的数据库管理需求,停止或者打开当前用户(模式)下所有表的约束条件和触发器.这在数据库的合并以及对数据库系统的代码表中某些代码的修改时需要做的工作之一. 我们来看这样一种实际数据库工作业务需求,这在目前的许多应用中是非常实际的.某地区银行数据,目前采用市级数据集中,随着计算机网络技术的不断提高以及对服务水平的要求,提出了省级乃至国家级的数据集中.除了应用需要修改以外,对于数据库管理员来讲,最重要的工作就是 对各地分散管理的数据库统一集中到一个或者几个集中

Oracle管理约束(一)Oracle约束基本概念

数据的完整性用于确保数据库数据遵循特定的商业规则. 在Oracle 数据库中,可以使用约束.触发器和应用代码(过程.函数)3种方法实现数据的完整性. 今天我们主要讨论如何使用约束去保证数据的完整性和一致性. 1.约束的功能 通过一些强制性商业规则,保证数据的完整性.一致性 2.约束的类别 1) not null 2) check 3) unique 4) primary key (not null + unique) 5) foreign key (reference) 3.约束的状态 1)EN

Oracle autotrace简介

recursive calls 用户或系统产生的递归调用的数量; db block gets:当前数据块被请求的次数; consitent gets 从缓冲区高速缓存中获取重做数据块的数量; physical reads 从磁盘获取数据块的数量 redo size DML语句生成的重做数据的大小 bytes sent via SQL*Net to client 通过Oracle Net向客户端发送数据的字节数 bytes sent via SQL*Net from client 通过Oracle

Oracle并行简介

并行DML操作需注意2点: 1).显示在会话里执行:alter session enable parallel dml; 2).对于Delete.Update .Merge的操作,只有被操作的对象是分区表时,Oracle才会启用并行操作; 3).对于insert只有insert into ...select * from 此形式才有用; 各种并行操作举例如下: --并行delete delete /*+ parallel(t,2) */ * from t; --并行update update /

Oracle分析函数简介:排序

Oracle常用的用于排序的分析函数有3种,rank().dense_rank().row_number(); 测试表如下: 1.rank() 跳跃式排名 with temp as ( select t_id,t_age, rank() over(order by t_age desc) sec  from aaa ) select * from temp --where sec=1--,加上此过滤条件,即可找出排名为1的记录 如果指定分组的话,如下: with temp as ( select

ORACLE审计简介

1.什么是审计 审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/ $ORACLE_SID/adump/)或数据库(存储在system表空间中的SYS.AUD$表中,可通过视图dba_audit_trail查看)中.默认情况下审计是没有 开启的. 不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance:启动数据库:关闭数据库. 2.和审计相关的两个主要参数 Aud