zoukankan      html  css  js  c++  java
  • [转]Oracle DB_约束

    1、了解数据完整性
     
    使用下列完整性约束条件可强制对输入的列值设置限制。
    • NOT NULL:默认情况下,表中的所有列均允许使用空值。单词null表示没有值。NOT NULL约束条件要求表列必须包含非空值。
    例如,可以通过定义NOT NULL约束条件来要求在EMPLOYEES表的每一行的LAST_NAME列中输入值。
    alter table employees modify last_name not null
     
     
    • UNIQUE键:UNIQUE键完整性约束条件要求一列或一组列(键)中的每个值必须唯一,即在指定的列或一组列中,表任意两行的值不重复
    例如,对DEPARTMENTS表的DEPARTMENT_NAME列定义了UNIQUE键约束条件,以便禁止行出现重复的部门名称。除了特殊情况,将与唯一索引一起强制使用这个约束条件。

    alter table departments add constraint department_name_uk unique(department_name)

     
     
    • PRIMARY KEY数据库中的每个表最多可包含一个PRIMARY KEY约束条件。在这个约束条件的限制下,单个列或一组列中的值就构成了行的唯一标识符。事实上,每行的名称均由其主键值确定。
    alter table departments add constraint departments _pk primary key (DEPARTMENT_ID);
     
     
    Oracle 服务器实施PRIMARY KEY完整性约束条件后可确保实现以下两个条件:
    • 在指定列或一组列中,表的任意两行不出现重复值(unique)。
    • 主键列不允许为空。也就是说,每行的主键列必须有一个值(not null)。
     
    正常情况下,数据库通过使用索引来强制设置PRIMARY KEY约束条件。为DEPARTMENTS表中DEPARTMENT_ID列创建的主键约束条件是通过隐式创建以下项来强制实现的:
    - 该列中的唯一索引
    - 该列的NOT NULL约束条件
     
     
    • 引用完整性约束条件:关系数据库中的各个表通过公用列相互关联,因此必须维护用于管理列关系的规则。使用引用完整性规则可确保保留这些关系。
    对于每个表行,引用完整性约束条件要求外键中的值必须与父键中的值匹配。
    例如,对EMPLOYEES表的DEPARTMENT_ID列定义了一个外键。它保证这一列中的每个值一定与DEPARTMENTS表主键中的值匹配。因此,在EMPLOYEES表的DEPARTMENT_ID列中不会存在错误的部门编号。
    另一类引用完整性约束条件被称为自引用完整性约束条件。此类外键引用同一表中的父键。
     
     
    • 检查约束条件:单个列或一组列的CHECK完整性约束条件要求为每个表行指定的条件必须为真或未知。
    如果某个数据操纵语言(DML) 语句导致IMMEDIATE约束条件的计算结果为FALSE,则会回退该语句。如果约束条件为可延迟的并设置为DEFERRED,则在提交时而不是执行DML 时发生回退。
     
     
     
     
    2、定义约束条件
    可以在创建表时指定约束条件,也可以使用alter table ...add constraint 来添加约束,也可以使用EM来添加约束。
    要使用Enterprise Manager 将约束条件添加到表,请执行以下操作:
     
    1.在“Tables(表)”页中选择表,然后单击“Edit(编辑)”。
     
     
    2. 单击“Constraints(约束条件)”选项卡。此时会出现“Constraints(约束条件)”页,其中显示为表定义的所有约束条件。
     
     
    3.从下拉列表中选择要添加的约束条件类型,然后单击“Add(添加)”。
     
     
    4.输入要定义的约束条件类型的相应信息。单击“OK(确定)”。
     
     
    点击继续。即添加了一个约束
     
     
    注:上面演示了如何创建唯一约束条件。
     
     
    3、违反约束条件
     
    提交不符合约束条件的DML 时就会出现违反约束条件的情况。违反约束条件的形式有多种,其中包括:
    • 唯一性:试图在具有唯一约束条件的列中使用重复值(例如,在某一列是主键,或者该列已建立唯一索引的情况下)。
    • 引用完整性:违反了每个子行具有一个父行的规则。
    • 检查:试图在列中存储一个不符合列定义规则的值。例如,AGE列可能具有强制该列为正数的检查约束条件。
     
     
     
    4、约束条件状态
     
    为了更好地处理数据可能暂时违反约束条件的情况,可将约束条件指定为不同的状态。可以启用(ENABLE) 或禁用(DISABLE) 完整性约束条件。
    如果启用约束条件,在数据库中输入或更新数据时就会检查数据。此时,禁止输入不符合约束条件规则的数据。
    如果禁用约束条件,则可以在数据库中输入不符合规则的数据。
     
    完整性约束条件可处于以下一种状态:
    • DISABLE NOVALIDATE
    • DISABLE VALIDATE
    • ENABLE NOVALIDATE
    • ENABLE VALIDATE
     
    DISABLE NOVALIDATE:不检查新数据和现有数据,因此这些数据可能不符合约束条件。
    当数据来自验证过的源,而且表是只读表时,通常会使用此状态。因此,不会将新数据输入表中。在已清理了数据的数据仓库环境中使用NOVALIDATE。此时不需要进行验证,因而可以节省很多时间。
    DISABLE VALIDATE:如果约束条件处于此状态,则不允许对有约束条件的列进行任何修改。因为如果在验证现有数据后,又允许将未经检查的数据输入表中,就会出现不一致的情况。通常,在必须验证现有数据但不进行修改时,以及不需要索引来提高性能时,可使用此状态。
    ENABLE NOVALIDATE:新数据符合约束条件,但现有数据处于未知状态。通常在确信表中只存在纯净数据和符合规则的数据的情况下使用该状态,此时不需要进行验证。但是,不允许将违反规则的新数据输入到系统中。
    ENABLE VALIDATE:新数据与现有数据均符合约束条件。这是约束条件的典型状态和默认状态。
     
     
     
    5、约束条件检查
     
     
    可以将约束条件的有效性检查延迟到事务处理结束时。
    非延迟约束条件又称“即时约束条件”,是在每个DML 语句结束时强制执行的。违反约束条件会导致回退语句。如果约束条件导致诸如delete cascade等操作,则此操作会在导致其执行的语句执行时执行。
    定义为“非延迟”的约束条件不能更改为延迟约束条件。
    对于非延迟约束条件,主键约束条件和唯一键约束条件需要唯一的索引;如果某列或某几列已有一个非唯一索引,则将使用该索引。
     
    延迟约束条件是提交事务处理时才检查的约束条件。如果在提交时检测到任何违反约束条件的情况,则会回退整个事务处理。当同时输入外键关系中的父行和子行(如在订单录入系统中,需要同时录入订单和订单中的各个项目)时,这些约束条件非常有用。对于延迟约束条件,主键和唯一键需要不唯一的索引;如果某列或某几列具有唯一的索引,则创建约束条件时会失败,因为这些索引不能被延迟。
     
    可以将定义为“延迟”的约束条件指定为下列方式之一:
    • “Initially immediate”,指定在默认情况下,约束条件必须用作即时约束条件,除非显式设置为其它方式。
    • “Initially deferred”,指定在默认情况下,只在事务处理结束时强制使用约束条件。
    注:如果该列已存在适当的索引,则将它用于约束条件。不需要为主键和唯一键创建附加索引。
     
    检查约束条件的时机:
    • 执行语句时(对于非延迟约束条件)
    • 发出COMMIT时(对于延迟约束条件)
    案例:DML 语句后接COMMIT
    1. 已检查非延迟约束条件
    2. 已发出COMMIT
    3. 已检查延迟约束条件
    4.COMMIT已完成
     
     
    6、使用SQL 创建约束条件:示例
     
    a. ALTER TABLE countries ADD (UNIQUE(country_name) ENABLE NOVALIDATE);
    执行此语句后,对COUNTRIES表执行的任何插入或更新操作都必须具有唯一的COUNTRY_NAME值。但是,有可能在发出此语句时,表中已存在非唯一的COUNTRY_NAME值。NOVALIDATE关键字指示应忽略这些值。仅新行受到约束条件的约束。
     
     
    b. ALTER TABLE shopowner.jobs ADD CONSTRAINT job_pk PRIMARY KEY (job_id);
    此语句向JOBS表添加主键。约束条件名称为JOB_PK,主键为JOB_ID列。
     
     
    c.
    CREATE TABLE emp (emp_no NUMBER PRIMARY KEY,Last_name
    VARCHAR2(30), first_name VARCHAR2(30), dept_no NUMBER,
    Mgr_no NUMBER, hire_date date,salary NUMBER,
    CONSTRAINT Mgr_FK FOREIGNKEY (mgr_no) REFERENCES
    emp(emp_no),CONSTRAINT ck1CHECK (salary > 0));
     
    此语句在创建表时定义约束条件,而不是以后使用ALTER TABLE语句进行定义。
    MGR_FK约束条件确保MGR_NO列中的值必须存在于表的主键列中。CK1约束条件确保SALARY大于零。
     
    违反约束条件时,会出现如下错误:
    INSERT INTO emp
    (Select employee_id , last_name, first_name,department_id,
    manager_id, hire_date, salary FROM HR.employees where
    department_id =30);
    2 INSERT INTO emp
    *
    ERROR at line 1:
    ORA-02291: integrity constraint (SYS.MGR_FK) violated - parent key not found
    注:每个约束条件都有一个名称。如果在创建约束条件时未指定名称,则系统会分配一个以SYS_开头的名称。
     
    来源:http://blog.csdn.net/rlhua/article/details/12251961
  • 相关阅读:
    软件升级细节卸载删除快捷方式等前需要检测
    安装gitlab的总结
    如何修改vagrant系统的root用户密码
    写一个PHP单例模式
    redis使用笔记
    mysql 删除商品名字重复数据,同时保留最新一条
    杀死僵尸进程
    Django 用户状态管理,认证,失效
    关于iOS多任务的一些扫盲
    ajax异步
  • 原文地址:https://www.cnblogs.com/gispf/p/3728127.html
Copyright © 2011-2022 走看看