`

ORACLE中CONSTRAINT的四对属性

阅读更多
ORACLE中CONSTRAINT的四对属性
summary:在data migrate时,某些表的约束总是困扰着我们,让我们的migratet举步维艰,如何利用约束本身的属性来处理这些问题呢?本文详细介绍了约束的四对属性: Deferrable/not deferrable, Deferred/immediate, enalbe/disable, validate/novalidate,以及如何应用这些属性灵活应对相关问题


是否要求满足约束         Validate                                Novalidate
------------------------------------------------------------------------------------
                        已有记录     新增/修改记录        已有记录    新增/修改记录
Enable                  Yes        Yes                     No          Yes
Disable                 Yes         No                      No           No


Validate确保已有数据符合约束;
Novalidate不必考虑已有数据是否符合约束。
除非Novalidate被指定,Enable默认Validate;
除非Validate被指定,Disable默认Novalidate;

Validate和Novalidate对Enable和Disable没有任何默认暗示。
Enable Validate与Enable相同,检查已有记录和新增记录,确保都符合约束;
Enable Novalidate 允许已有记录不必满足约束条件,但新增/修改的记录必须满足;
Disable Validate禁用约束,删除约束上的索引,不允许修改任何被约束的记录;
Disable Novalidate与Disable相同,禁用约束,删除约束上的索引,且允许修改被约束的记录。


1.     Deferrable,not deferrable(default value)

1)      这对属性是定义是否可以defer,defer是指作检查的时机,如果在commit的时check为Defer,否则为immediate .只有在设置Deferrable才可以设置另一个属性2-- Deferred,immediate.

2)      设置defer check的方法有两种(前提是建立了Deferrable的contraint)

a.       通过建contraint时指定Deferred值

b.      通过会话级别的语句修改

           SET CONSTRAINT(s) contraint_name/all  immediate/deferred.

3)      这对属性是在创建的constraint的时候定义的,不能被修改.

4)  notice:如果建立了Deferrable的uk或pk,只会建立相应的nonuniquce index,而不会建立uniquce index  

2.     Deferred,immediate(default value) 

1)      这对属性定义是否defer.   Deferred: check on commit; immediate: check immediate.

2)      If constraint is not deferrable,immediate is only choice.

3)      For  example:



CREATE TABLE games

  (scores NUMBER, CONSTRAINT unq_num UNIQUE (scores)

   INITIALLY DEFERRED DEFERRABLE);

insert into games values(1);

insert into games values(1);

commit;--在此报错

You will not get a error util you commit it;





SET CONSTRAINT(s) unq_num immediate;--修改属性

insert into games values(2);

insert into games values(2);--在此报错

commit;

You will get a error when you execute the second sql;

3.      novalidate, validate(default value)

1)      这对属性定义constraint是否对表中已经存在的数据作检查,例如:

create table t(id number);
insert   into t values(1);
insert   into t values(2);
alter table t add constraint ch_100 check(id>=100);  --失败
alter table t add constraint ch_100 check(id>=100) novalidate;--成功

2)      notice:与唯一索引相关的contraint(例如pk,uk),要做到以上的效果还必须设置为Deferrable(只是建立非唯一性索引),因为在维护索引是,如果违反了唯一性也会报错,所以必须建立非唯一性索引.例如:

drop table t;
create table t(id number);
insert   into t values(1);
insert   into t values(1);
alter table t add constraint ch_100 unique(id) ; --报错
alter table t add constraint ch_100  unique(id) novalidate; --报错
alter table t add constraint ch_100  unique(id)  deferrable  novalidate;--成功

4.     disable, enalbe(default value)     

1)      启用和禁用constraint.在新建pk和uk时定义了disable,将不建立相应的索引.

ALTER TABLE dept DISABLE CONSTRAINT dname_ukey;

ALTER TABLE dept ENABLE CONSTRAINT dname_ukey;

alter table t add constraint ch_100  unique(id) disable;



2)      DISABLE  uk或pk作了些什么:

Disable非deferrable 的pk、uk,将删除相应的索引(除非指定了keep index,但是keep下来的索引是唯一性的,insert数据时还是要作唯一性检查的),在enable时重建索引.

Disbale  deferrable 的pk、uk将保留原来的索引(因为原来的索引就是非唯一性的,不影响insert的操作).



3)      一些操作经验

KEEP INDEX要注意的:

  a.ALTER TABLE games  DISAble  CONSTRAINT fk_num keep index;--唯一索引被保留,所以还是不能插入重复的数据.不应该keep index.

  b.ALTER TABLE games  DISAble  CONSTRAINT fk_num;--如果上一步被执行,那么此语句什么都不做,唯一索引仍被保留,此时应该先enable在disable.如果原来的状态是able的话,那么唯一索引将被删除.





5.    报告约束异常



    如果校验约束时存在异常,则返回一个错误,且完整性约束仍保持未被校验状态。当约束存在异常时,一个语句就不能正确执行,则此语句被回滚。如果存在异常,必须要更新或删除了约束的所有异常后,才可以校验约束。但是在使用ALTER TABLE语句不能确定哪一行违反约束,为了确定哪一行,在发布ENABLE子句中带有EXCEPTION选项的ALTER TABLE语句。



    EXCEPTION选项将ROWID、OWNER、TABLE、ROWID、CONSTRAINT放到一个指定的表中。在启用约束前,硬创建一个合适的异常报告表,用来接收ENABLE子句的EXCEPTION选项信息,可以直接执行'?\rdbms\admin\utlexcpt.sql'或'?\rdbms\admin\utlexcpt1.sql'脚本来进行创建。注意:这两个脚本的区别在于数据库的兼容性级别和所分析的表的类型。



    使用的语法如下:



    ALTER TABLE dept ENABLE PRIMARY KEY EXCEPTIONS INTO EXCEPTIONS;

或者

    alter table team disable validate   constraint id_num   EXCEPTIONS INTO EXCEPTIONS;--这个方法不创建索引
 

    如果存在异常,则直接查询 SELECT * FROM EXCEPTIONS; 即可。如果需要更加详细的信息,则可以使用ROWID与原表的ROWID进行关联,这样就可以查出原始表中当前行的所有信息,并进行修改。

如何利用EXCEPTIONS来处理实践中的一些问题:

(1)在已有的constraint上加载数据

        先 disable

        再加载

        再enable and EXCEPTIONS INTO EXCEPTIONS

     再根据EXCEPTIONS表的纪录delete

      最后enable

(2)新建constraint,原有的数据违反了这个约束

        先create disable

        再enable and EXCEPTIONS INTO EXCEPTIONS
      以下是一个新建外键的例子  

alter table team add constraint id_num foreign key(id)  references games(scores) INITIALLY disable; 
   alter table team enable   constraint id_num   EXCEPTIONS INTO EXCEPTIONS;           select * from EXCEPTIONS;









6.     关于contraint操作的一些脚步

定义约束


         alter table t add constraint ch_100  unique(id) disable  ;

   alter table t add constraint ch_100  unique(id);
        alter table t add constraint ch_100  unique(id) deferred deferrable novalidate;

CREATE TABLE dept_20

   (employee_id     NUMBER(4), 

    commission_pct  NUMBER(7,2),

    department_id,

   CONSTRAINT fk_deptno

      FOREIGN  KEY (department_id)

      REFERENCES  departments(department_id)

      on delete/set null cascade);



ALTER TABLE dept_20

   ADD CONSTRAINT fk_empid_hiredate

   FOREIGN KEY (employee_id, hire_date)

   REFERENCES hr.job_history(employee_id, start_date)

   EXCEPTIONS INTO EXCEPTIONS;



CREATE TABLE divisions

   (div_no    NUMBER  CONSTRAINT check_divno

              CHECK (div_no BETWEEN 10 AND 99)

              DISABLE,

    div_name  VARCHAR2(9)  CONSTRAINT check_divname

              CHECK (div_name = UPPER(div_name))

              DISABLE,

    office    VARCHAR2(10)  CONSTRAINT check_office

              CHECK (office IN ('DALLAS','BOSTON',

              'PARIS','TOKYO'))

              DISABLE);







修改或删除现有的约束



    注:在使用外键参考了PRIMARY或UNIQUE键时,不能停用或删除被参考约束

 

    延迟校验的启用停用:

    SET CONSTRAINT(s) unq_num/all immediate;

      SET CONSTRAINT(s) unq_num/all deferred;



    停用:

    ALTER TABLE dept DISABLE CONSTRAINT dname_ukey;

    ALTER TABLE dept DISABLE PRIMARY KEY KEEP INDEX,

                     DISABLE UNIQUE (dname, loc) KEEP INDEX;



    启用非校验:

    ALTER TABLE dept ENABLE CONSTRAINT dname_ukey;

    ALTER TABLE dept ENABLE NOVALIDATE PRIMARY KEY,

                     ENABLE NOVALIDATE UNIQUE (dname, loc);



    启用校验:

    ALTER TABLE dept MODIFY CONSTRAINT dname_ukey VALIDATE;

    ALTER TABLE dept MODIFY PRIMARY KEY ENABLE NOVALIDATE;



    若要停用/删除相关的FOREIGN KEY约束,则:

    ALTER TABLE dept DISABLE PRIMARY KEY CASCADE;



    删除:

    ALTER TABLE dept DROP UNIQUE (dname, loc);

    ALTER TABLE emp DROP PRIMARY KEY KEEP INDEX,

                    DROP CONSTRAINT dept_fkey;
分享到:
评论

相关推荐

    Oracle Configurator Constraint Definition Language Guide Release

    总之,Oracle Configurator Constraint Definition Language Guide Release 11i是Oracle EBS11中产品配置开发的关键参考资料,它提供了一个强大的工具,使得企业能够定制和管理高度灵活和复杂的配置规则,以满足不同...

    Oracle MSSQL查询表结构属性

    了解了这些查询后,你将能够有效地在Oracle和MSSQL中探索和理解表的结构属性。通过熟练掌握这些技能,数据库管理员和开发人员可以更好地设计、维护和优化数据库。记住,每个数据库系统都有其特定的语法和方法,因此...

    oracle中sql语句用法

    根据提供的文件信息,我们可以深入探讨Oracle数据库中的几个关键知识点:序列的创建、各种类型的约束以及用户的解锁操作。接下来,我们将详细地对这些知识点进行解析。 ### 一、Oracle中序列的创建 序列在Oracle...

    oracle 学习心得与总结

    以下是我对Oracle学习的一些心得和总结,主要聚焦于数据库对象,尤其是表及其约束。 1. **数据库对象**: 数据库对象是Oracle中的基本组成部分,包括表、视图、索引、存储过程、函数、触发器等。这些对象共同构成...

    从mysql转换到oracle数据库.docx

    6. 去掉 `auto_increment` 选择项,因为 Oracle 数据库中没有自增属性。 7. 将 `NOT NULL default ''` 替换成 `default '' NOT NULL`。 8. 将 `ON DELETE CASCADE ON UPDATE CASCADE` 替换成 `ON DELETE CASCADE ON ...

    Oracle 增加修改删除字段

    在Oracle数据库中,我们经常需要对现有的表结构进行调整,比如增加新的字段、修改现有字段的属性或数据类型、删除不再使用的字段等。这些操作可以通过`ALTER TABLE`命令来完成。本文将详细介绍如何使用`ALTER TABLE`...

    Oracle_基本建表语句

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的功能来创建、管理及操作各种...这些命令和概念构成了Oracle数据库管理的基础,对于任何希望在Oracle环境中工作的开发者或DBA来说都是必不可少的知识。

    oracle改属性[文].pdf

    在软件开发中,对Oracle表结构的修改是一项常见的任务,涉及到表的增删改查等操作。本文将详细解析在Oracle中如何使用`ALTER TABLE`语句来更改表的属性。 首先,`ALTER TABLE`命令用于修改已存在的表的结构,包括...

    Oracle系统表查询

    在SQL语言中,SELECT语句是使用最频繁的命令,主要被用来对数据库进行查询并返回符合用户查询标准的结果数据。SELECT语句的语法格式如下: SELECT column1 [, column2, etc] FROM tablename [WHERE condition]; ...

    在Oracle 9i中修改表的结构的相关sql语句

    在Oracle 9i数据库系统中,对现有表的结构进行修改是常见的数据库管理操作之一。这种操作涉及到SQL语言中的ALTER TABLE语句,该语句允许数据库管理员或具有相应权限的用户对现有的表结构进行更改,包括添加列、修改...

    oracle及sql命令大全

    在本文中,我们将深入探讨Oracle数据库系统以及SQL命令的使用。 Oracle数据库系统: Oracle数据库是一个全面的企业级解决方案,它提供了强大的数据存储、管理和处理能力。Oracle的核心功能包括事务处理、数据仓库、...

    Oracle数据库执行脚本文件

    ### Oracle数据库执行...通过以上步骤,我们不仅可以了解如何在Oracle数据库中执行各种操作,还能掌握相关的最佳实践和注意事项。这些知识点对于数据库管理员来说至关重要,可以帮助他们更好地管理和维护数据库系统。

    ocl.rar_ocl_oracle_oracle OCL_oracle OCL

    在Oracle的世界中,OCL(Object Constraint Language)是一种形式化语言,用于在模型驱动工程(MDE)中定义对象的行为和约束。OCL提供了一种标准化的方式来表达对UML(统一建模语言)模型的精确条件和限制,增强了...

    Oracle数据库精华

    ### Oracle数据库精华知识点详解 #### 一、Oracle数据库简介及特点 Oracle数据库是甲骨文公司...此外,通过实践操作,还可以加深对数据库原理的理解。希望本资料能帮助读者在短时间内建立起扎实的Oracle数据库基础。

    oracle数据库查询语句大全

    此外,文章还介绍了基本的Oracle操作语句,包括创建表、修改列属性、添加列、添加主键约束和非空约束、删除主键约束、失效约束、有效约束等。这些语句对于初学者非常重要,因为它们可以帮助初学者快速地掌握Oracle...

    oracle查询语句大全

    根据提供的文件信息,以下是从标题、描述、标签和部分内容中提取的关键知识点,这些知识点主要围绕Oracle数据库中的查询语句和基本操作展开。 ### Oracle 查询语句大全 #### 1. 查询表信息 - **查询所有表**: - `...

    Oracle基本建表语句

    在Oracle数据库中,创建用户是基础操作之一。这通常用于控制不同开发者或应用程序之间的访问权限。 **语法:** ```sql CREATE USER <username> IDENTIFIED BY <password> DEFAULT TABLESPACE <tablespace_name> ...

    Oracle的SQL语法大全

    以下是对Oracle SQL语法的详细解析: **一、数据控制语句 (DML)** 1. **INSERT**: 插入数据到表中。有两种基本形式: - 直接插入:`INSERT INTO 表名(字段名1, 字段名2, ...) VALUES (值1, 值2, ...);` - 从另一...

Global site tag (gtag.js) - Google Analytics