`
sckjyxgs
  • 浏览: 23883 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle数据库完整性约束规则

 
阅读更多
  完整性约束用于增强数据的完整性,Oracle提供了5种完整性约束:

  Check

  NOT NULL

  Unique

  Primary

  Foreign key

  完整性约束是一种规则,不占用任何数据库空间。完整性约束存在数据字典中,在执行SQL或PL/SQL期间使用。用户可以指明约束是启用的还是禁用的,当约束启用时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中。

  禁用约束,使用ALTER语句


以下是代码片段:
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;


  或


以下是代码片段:
ALTER TABLE policies DISABLE CONSTRAINT chk_gender


  如果要重新启用约束:


以下是代码片段:
ALTER TABLE policies ENABLE CONSTRAINT chk_gender


  删除约束


以下是代码片段:
ALTER TABLE table_name DROP CONSTRAINT constraint_name


  或


以下是代码片段:
ALTER TABLE policies DROP CONSTRAINT chk_gender;


  Check 约束

  在数据列上Check 约束需要一个特殊的布尔条件或者将数据列设置成TRUE,至少一个数据列的值是NULL,Check约束用于增强表中数据内容的简单的商业规则。用户使用 Check约束保证数据规则的一致性。Check约束可以涉及该行同属Check约束的其他数据列但不能涉及其他行或其他表,或调用函数SYSDATE, UID,USER,USERENV。如果用户的商业规则需要这类的数据检查,那么可以使用触发器。Check约束不保护LOB数据类型的数据列和对象、嵌套表、VARRY、ref等。单一数据列可以有多个Check约束保护,一个Check约束可以保护多个数据列。

  创建表的Check约束使用CREATE TABLE语句,更改表的约束使用ALTER TABLE语句。

  语法:


以下是代码片段:
CONSTRAINT [constraint_name] CHECK (condition);


  Check约束可以被创建或增加为一个表约束,当Check约束保护多个数据列时,必须使用表约束语法。约束名是可选的并且如果这个名字不存在,那么oracle将产生一个以SYS_开始的唯一的名字。

 例:



以下是代码片段:
   CREATE TABLE policies
  (policy_id NUMBER,
  holder_name VARCHAR2(40),
  gender VARCHAR2(1) constraint chk_gender CHECK (gender in ('M','F'),
  marital_status VARCHAR2(1),
  date_of_birth DATE,
  constraint chk_marital CHECK (marital_status in('S','M','D','W'))
  );




  NOT NULL约束

  NOT NULL约束应用在单一的数据列上,并且他保护的数据列必须要有数据值。缺省状况下,ORACLE允许任何列都可以有NULL值。某些商业规则要求某数据列必须要有值,NOT NULL约束将确保该列的所有数据行都有值。

  例:



以下是代码片段:
   CREATE TABLE policies
  (policy_id NUMBER,
  holder_name VARCHAR2(40) NOT NULL,
  gender VARCHAR2(1),
  marital_status VARCHAR2(1),
  date_of_birth DATE NOT NULL
  );



  对于NOT NULL的ALTER TABLE语句与其他约束稍微有点不同。



以下是代码片段:
ALTER TABLE policies MODIFY holder_name NOT NULL



  唯一性约束(Unique constraint)

  唯一性约束可以保护表中多个数据列,保证在保护的数据列中任何两行的数据都不相同。唯一性约束与表一起创建,在唯一性约束创建后,可以使用ALTER TABLE语句修改。

  语法:



以下是代码片段:
column_name data_type CONSTRAINT constraint_name UNIQUE



  如果唯一性约束保护多个数据列,那么唯一性约束要作为表约束增加。语法如下:



以下是代码片段:
CONSTRAINT constraint_name (column) UNIQUE USING INDEX TABLESPACE (tablespace_name) STORAGE (stored clause)



  唯一性约束由一个B-tree索引增强,所以可以在USING子串中为索引使用特殊特征,比如表空间或存储参数。CREATE TABLE语句在创建唯一性约束的同时也给目标数据列建立了一个唯一的索引。



以下是代码片段:
    CREATE TABLE insured_autos
  (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
  vin VARCHAR2(10),
  coverage_begin DATE,
  coverage_term NUMBER,
  CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
  );



  用户可以禁用未以性约束,但他仍然存在,禁用唯一性约束使用ALTER TABLE 语句



以下是代码片段:
ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;



  删除唯一性约束,使用ALTER TABLE....DROP CONSTRAIN语句



以下是代码片段:
ALTER TABLE insured_autos DROP CONSTRAIN unique_name;



  注意用户不能删除在有外部键指向的表的唯一性约束。这种情况下用户必须首先禁用或删除外部键(foreign key)。

  删除或禁用唯一性约束通常同时删除相关联的唯一索引,因而降低了数据库性能。经常删除或禁用唯一性约束有可能导致丢失索引带来的性能错误。要避免这样错误,可以采取下面的步骤:

  1、在唯一性约束保护的数据列上创建非唯一性索引。

  2、添加唯一性约束

  主键(Primary Key)约束

  表有唯一的主键约束。表的主键可以保护一个或多个列,主键约束可与NOT NULL约束共同作用于每一数据列。NOT NULL约束和唯一性约束的组合将保证主键唯一地标识每一行。像唯一性约束一样,主键由B-tree索引增强。

  创建主键约束使用CREATE TABLE语句与表一起创建,如果表已经创建了,可以使用ALTER TABLE语句。



以下是代码片段:
   CREATE TABLE policies
  (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
  holder_name VARCHAR2(40),
  gender VARCHAR2(1),
  marital_status VARCHAR2(1),
  date_of_birth DATE
  );



  与唯一性约束一样,如果主键约束保护多个数据列,那么必须作为一个表约束创建。



以下是代码片段:
    CREATE TABLE insured_autos
  (policy_id NUMBER,
  vin VARCHAR2(40),
  coverage_begin DATE,
  coverage_term NUMBER,
  CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin)
  USING INDEX TABLESPACE index
  STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
  );



  禁用或删除主键必须与ALTER TABLE 语句一起使用



以下是代码片段:
ALTER TABLE policies DROP PRIMARY KEY;



  或



以下是代码片段:
ALTER TABLE policies DISABLE PRIMARY KEY;


  外部键约束(Foreign key constraint)

  外部键约束保护一个或多个数据列,保证每个数据行的数据包含一个或多个null值,或者在保护的数据列上同时拥有主键约束或唯一性约束。引用(主键或唯一性约束)约束可以保护同一个表,也可以保护不同的表。与主键和唯一性约束不同外部键不会隐式建立一个B-tree索引。在处理外部键时,我们常常使用术语父表(parent table)和子表(child table),父表表示被引用主键或唯一性约束的表,子表表示引用主键和唯一性约束的表。

  创建外部键使用CREATE TABLE语句,如果表已经建立了,那么使用ALTER TABLE语句。



以下是代码片段:
    CREATE TABLE insured_autos
  (policy_id NUMBER CONSTRAINT policy_fk
  REFERENCE policies(policy_id
  ON DELETE CASCADE,
  vin VARCHAR2(40),
  coverage_begin DATE,
  coverage_term NUMBER,
  make VARCHAR2(30),
  model VARCHAR(30),
  year NUMBER,
  CONSTRAIN auto_fk FROEIGN KEY (make,model,year)
  REFERENCES automobiles (make,model,year)
  ON DELETE SET NULL
  );



  ON DELETE子串告诉ORACLE如果父纪录(parent record)被删除后,子记录做什么。缺省情况下禁止在子记录还存在的情况下删除父纪录。

  外部键和NULL值

  在外部键约束保护的数据列中NULL值的处理可能产生不可预料的结果。ORACLE 使用ISO standar Match None规则增强外部键约束。这个规则规定如果任何外部键作用的数据列包含有一个NULL值,那么任何保留该键的数据列在父表中没有匹配值。

  比如,在父表AUTOMOBILES中,主键作用于数据列MAKE,MODEL,YEAR上,用户使用的表INSURED_AUTOS有一个外部约束指向AOTOMOBILES,注意在INSURES_AUTOS中有一数据行的MODEL列为NULL值,这一行数据已经通过约束检查,即使MAKE列也没有显示在父表AUTOMOBILES中,如下表:

  表1 AUTOMOBILES



MAKE  MODEL  YEAR
Ford  Taurus 2000
Toyota Camry  1999



  表2 INSURED_AUTOS



POLICY_ID MAKE  MODEL  YEAR
576  Ford  Taurus  2000
577  Toyota Camry  1999 
578  Tucker  NULL  1949



  延迟约束检验(Deferred Constraint Checking)

  约束检验分两种情况,一种是在每一条语句结束后检验数据是否满足约束条件,这种检验称为立即约束检验(immediately checking),另一种是在事务处理完成之后对数据进行检验称之为延迟约束检验。在缺省情况下Oracle约束检验是立即检验(immediately checking),如果不满足约束将先是一条错误信息,但用户可以通过SET CONSTRAINT语句选择延迟约束检验。语法如下:



以下是代码片段:
SET CONSTRAINT constraint_name|ALL DEFEERRED|IMMEDIATE --;



  序列(Sequences)

  Oracle序列是一个连续的数字生成器。序列常用于人为的关键字,或给数据行排序否则数据行是无序的。像约束一样,序列只存在于数据字典中。序列号可以被设置为上升、下降,可以没有限制或重复使用直到一个限制值。创建序列使用SET SEQUENCE语句。



以下是代码片段:
CREATE SEQUENCE [schema] sequence KEYWORD



  KEYWORD包括下面的值:



KEYWORD  描述
START WITH  定义序列生成的第一个数字,缺省为1
INCREMENT BY  定义序列号是上升还是下降,对于一个降序的序列INCREMENT BY为负值
MINVALUE  定义序列可以生成的最小值,这是降序序列中的限制值。缺省情况下该值为NOMINVALUE,NOMINVALUE,对于升序为1,对于降序为-10E26.
MAXVALUE  序列能生成的最大数字。这是升序序列中的限制值,缺省的MAXVALUE为NOMAXVALUE,NOMAXVALUE,对于升序为10E26,对于降序为-1。
CYCLE  设置序列值在达到限制值以后可以重复
NOCYCLE  设置序列值在达到限制值以后不能重复,这是缺省设置。当试图产生MAXVALUE+1的值时,将会产生一个异常
CACHE  定义序列值占据的内存块的大小,缺省值为20
NOCACHE  在每次序列号产生时强制数据字典更新,保证在序列值之间没有间隔当创建序列时,START WITH值必须等于或大于MINVALUE。



  删除序列使用DROP SEQUENCE语句



以下是代码片段:
DROP SEQUENCE sequence_name



  索引(INDEXES)

  索引是一种可以提高查询性能的数据结构,在这一部分我们将讨论索引如何提高查询性能的。ORACLE提供了以下几种索引:

  B-Tree、哈希(hash)、位图(bitmap)等索引类型

  基于原始表的索引

  基于函数的索引

  域(Domain)索引

  实际应用中主要是B-Tree索引和位图索引,所以我们将集中讨论这两种索引类型。

  B-Tree索引

  B-Tree索引是最普通的索引,缺省条件下建立的索引就是这种类型的索引。B-Tree索引可以是唯一或非唯一的,可以是单一的(基于一列)或连接的(多列)。B-Tree索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。对于取出较小的数据B-Tree索引比全表检索提供了更有效的方法。但当检查的范围超过表的10%时就不能提高取回数据的性能。正如名字所暗示的那样,B-Tree索引是基于二元树的,由枝干块(branch block)和树叶块(leaf block)组成,枝干块包含了索引列(关键字)和另一索引的地址。树叶块包含了关键字和给表中每个匹配行的ROWID。

  位图索引

  位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引可以是简单的(单列)也可以是连接的(多列),但在实践中绝大多数是简单的。位图索引最好用于低到中群集(cardinality)列,在这些列上多位图索引可以与AND或OR操作符结合使用。位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。位图索引的位图存放在B-Tree结构的页节点中。B-Tree结构使查找位图非常方便和快速。另外,位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多。

  同义词(Synonyms)

  对另一个数据对象而言同义词是一个别名。public同义词是针对所有用户的,相对而言private同义词则只针对对象拥有者或被授予权限的账户。在本地数据库中同义词可以表示表、视图、序列、程序、函数或包等数据对象,也可以通过链接表示另一个数据库的对象。

  创建同义词语法如下:



以下是代码片段:
CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] object[@db_link];



  例:



以下是代码片段:
CREATE PUBLIC SYNONYM policies FOR poladm.policies@prod;





以下是代码片段:
 CREATE SYNONYM plan_table FOR system.plan_table;


分享到:
评论

相关推荐

    Oracle数据库的完整性约束规则详解

    ### Oracle数据库的完整性约束规则详解 #### 一、概述 Oracle数据库通过实施一系列的完整性约束规则来维护数据的准确性和一致性。这些约束规则是数据库设计中的核心组成部分,旨在防止不符合预定义规则的数据进入...

    Oracle数据库的完整性约束和序列规则详解

    Oracle数据库的完整性约束和序列规则是数据库管理中的关键概念,它们确保了数据的准确性和一致性。完整性约束主要有五种类型:Check约束、NOT NULL约束、Unique约束、Primary键约束和Foreign key约束。 Check约束...

    基于Oracle数据库的完整性约束应用研究.pdf

    首先,完整性约束是Oracle数据库中用于规定数据约束的规则,分为四大类:实体完整性(Primary Key)、参照完整性(Foreign Key)、唯一性约束(Unique)和检查约束(Check)。例如,`UNIQUE(it_name)` 约束确保了表...

    Oracle数据库的完整性约束和序列规则详解[收集].pdf

    Oracle数据库的完整性约束和序列规则详解 Oracle数据库中的完整性约束是指数据库中的一种规则,用于增强数据的完整性。Oracle提供了五种完整性约束:Check、NOT NULL、Unique、Primary key和Foreign key。这些约束...

    Oracle数据完整性约束机制

    Oracle 数据库的完整性约束机制是防止无效的数据进入数据库的基表的重要手段。如果任何 DML 执行结果破坏完整性约束,该语句被回滚并返回一上个错误。Oracle 实现的完整性约束完全遵守 ANSI X3.135-1989 和 ISO9075-...

    数据库5关系数据库完整性实验.doc

    本实验主要探讨的是关系数据库中的完整性概念,通过Oracle数据库管理系统进行实践,旨在加深对数据库完整性的理解。完整性是数据库设计的核心要素之一,它确保了数据库中的数据准确、一致,避免了错误的插入、更新或...

    Oracle数据库基础教程-参考答案

    9. 完整性约束: - 实体完整性:通过主键确保每条记录的唯一性,不允许空值。 - 参照完整性:通过外键关联不同表,保证引用的合法性。 - 用户定义完整性:用户自定义的约束,确保数据符合特定业务规则。 10. ...

    oracle 数据库约束笔记

    Oracle 数据库约束是一种机制,用于确保数据库数据的完整性和一致性。约束是指在数据库中强制执行某些规则,以确保数据的正确性和一致性。Oracle 数据库提供了多种类型的约束,包括 NOT NULL、UNIQUE、PRIMARY KEY、...

    违反完整性约束的解决办法

    当数据库的操作(如插入、更新或删除记录)试图破坏预先定义的数据完整性规则时,就会发生违反完整性约束的情况。这种情况下,必须采取措施来解决问题,以恢复数据的完整性。本文将详细介绍一个具体的解决方案——一...

    Oracle数据库Oracle数据库.ppt

    关系模型由对象类型集合、操作集合和完整性约束规则集合组成。在E-R(实体-关系)模型中,实体、联系和属性被用来描述现实世界的信息,然后可以转换为关系模式,如一对一、一对多和多对多的关系。例如,一个系可以有...

    oracle数据库比对工具

    这类工具的主要目的是确保数据库的一致性和完整性,特别是在数据库迁移、升级或同步过程中,它们扮演着至关重要的角色。 在Oracle数据库比对过程中,主要关注以下几个核心知识点: 1. **数据库结构比对**:这包括...

    Oracle数据库课堂笔记

    约束是确保数据完整性的规则,包括NOT NULL(非空约束)、UNIQUE(唯一约束)、PRIMARY KEY(主键约束)、FOREIGN KEY(外键约束)和CHECK(检查约束)。它们在数据插入和更新时自动执行,防止不符合规则的数据进入...

    Oracle数据库入门学习课件ppt

    - 主键与外键:确保数据完整性的约束。 - 表的创建、修改和删除:CREATE TABLE、ALTER TABLE、DROP TABLE语句。 6. **索引**: - 索引的作用:加快数据检索速度。 - B树索引与位图索引:不同类型的索引及其适用...

    Oracle数据库设计优化指导

    外键用于维护数据的一致性和完整性,关联不同表之间的关系。在设计时,要确保外键约束的有效性,避免数据冗余和不一致。 此外,规范可能还涵盖了其他设计原则,如字段类型的选择、索引策略的制定、表分区、存储段...

    oracle数据库编程规范

    - 强调了数据完整性的实现方法,包括外键约束等。 ##### 8.5 触发器 - 描述了触发器的设计和使用场景。 ##### 8.6 视图设计 - 规定了视图的设计原则和最佳实践。 ##### 8.7 包设计 - 提供了包的设计指导,包括存储...

    ORACLE数据库

    - 约束:包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK等,用于确保数据完整性。 4. **索引**: - 索引可以加速查询性能,有B树索引、位图索引、函数索引等多种类型。 - 如何创建、查看和删除索引,...

    找个oracle 数据库工作到底还该做什么啊?

    1. 数据库基础:理解关系数据库的基础知识,包括数据模型、数据字典、SQL语言、数据约束与完整性规则。 2. 数据库设计:能够参与或独立完成数据库设计工作,包括数据库需求分析、概念设计、逻辑设计和物理设计。 3...

    oracle数据库应用技术期末考试试题(A,B卷)

    9. 规则(rule)不是实现值域完整性的方法,因为从SQL Server 2000开始,规则已被约束(constraints)替代。 简答题部分可能涉及数据库设计、查询优化、数据库安全、备份策略等相关理论和技术细节,这部分需要具体...

    Oracle数据库设计规范

    每个表都应具有主键,它是唯一标识每行数据的关键,保证数据的唯一性和完整性。主键不应随意更改。外键约束用于建立表之间的关联,它们有助于维护数据一致性。虽然外键可能会增加数据库的开销,但在没有明确性能影响...

Global site tag (gtag.js) - Google Analytics