- 浏览: 771516 次
- 性别:
- 来自: 广州
文章分类
最新评论
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;
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 10g 的clusterware 32位 下载地址
2013-04-19 23:03 1163Oracle 10g 的clusterware 32位 下载地 ... -
oracle 分析函数 RANK()
2013-04-11 00:05 1066RANK()既是一个聚合函数,也是一个分析函数 其具体的语法 ... -
oracle 分析函数
2013-04-09 23:25 1136分析函数是用于计算一组中多行的聚合值,与聚合函数的区别在于聚合 ... -
批量执行 bulk collect与forall用法
2013-04-08 23:49 1339BULK COLLECT 子句会批量检 ... -
pl/sql集合类型
2013-03-26 10:12 1539--集合类型 /* 单行单列的数据,使用标量变量 单行 ... -
oracle 行链接与行迁移
2013-03-16 01:06 1067表里的一行对于一个数据块太大的情况有二种(一行在一个数据块里放 ... -
oracle Health Monitor
2013-01-20 00:02 1574About Health Monitor Beginning ... -
oracle moving window size与 AWR retention period关系
2013-01-19 15:58 8455转自: http://tomszrp.itpub.net/po ... -
Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
2013-01-12 00:20 2835insert提示IGNORE_ROW_ON_DUPKEY_IN ... -
oracle 11g新特性Flashback data archive
2013-01-09 22:52 30421. 什么是flashback data archive F ... -
RMAN List和report 命令
2012-12-25 00:07 2828LIST 命令 使用RMAN LIST 命令显示有关资料档案库 ... -
oracle ASM中ASM_POWER_LIMIT参数
2012-12-24 23:46 6368ASM_POWER_LIMIT 该初始化参数用于指定ASM例程 ... -
oracle I/O 从属进程
2012-12-24 23:24 1371I/O 从属进程 I/O从 ... -
easy connect 之 ORA-12154: TNS: 无法解析指定的连接标识符
2012-12-19 23:43 5592用easy connect连接出现“tns无法解析指定的连接标 ... -
Flashback Database --闪回数据库
2012-12-19 23:38 1336Flashback 技术是以Undo segment中的内容为 ... -
Oracle 11g新特性:Automatic Diagnostic Repository
2012-12-19 22:35 1348Oracle Database 11g的FDI(Fault D ... -
RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系
2012-12-19 22:09 2598RMAN配置中通道(CHANNEL)相 ... -
oracle 空间RESUMABLE
2012-12-14 22:05 3010空间RESUMABLE操作 转 Oracle从9i开始 ... -
oracle 创建视图 with check option
2012-12-13 23:14 1463我们来看下面的例子: create or replace vi ... -
flashback transaction闪回事务查询
2012-11-26 22:00 1460闪回事务查询有别于闪回查询的特点有以下3个: (1) ...
相关推荐
Oracle的Constraint约束,供初学者参考;
Oracle Configurator Constraint Definition Language Guide Release 11i
NULL 博文链接:https://mxm910821.iteye.com/blog/1470589
Oracle数据库Constraint约束的常用操作及异常处理[归类].pdf
数据字典(data dictionary)是存储在数据库中的所有对象信息的知识库。Oracle RDBMS使用数据字典获取对象信息和安全信息,而用户和DBA用它来查阅数据库信息。数据字典是只读的,终端用户和DBA通常使用的是建立在...
NULL 博文链接:https://snowelf.iteye.com/blog/494061
自己看视频做的笔记,以后再更新,虽然内容很少,但是一看就懂。我也是菜鸟,所以笔记都是菜鸟笔记
Oracle数据库constraint约束
NULL 博文链接:https://mlxnle.iteye.com/blog/1490247
constraint programming book
通过对Simulink模型添加信号约束模块(Signal Constraint block)可以优化已知输入的模型响应。Simulink设计优化软件(Simulink Design Optimization software)通过调整模型的参数来满足指定的约束,其中包括信号...
constraint代码约束Demo
主要给大家介绍了关于sql脚本导入Oracle时重复生成check约束的问题解决方法,文中给出了详细的检查步骤,对大家理解和解决这个问题具有很好的帮助,需要的朋友们下面来一起看看吧。
表是Oracle中最重要的数据库对象,表存储一些相似的数据集合,这些数据描述成若干列或字段.create table 语句的基本形式用来在数据库中创建容纳数据行的表.create table 语句的简单形式接收表名,列名,列数据类型和大小...
ppt about principles of constraint programming.
xilinx constraint.
Object Constraint Language
SpringBoot @Constraint自定义注解这可真叫人头秃 2020-03-18 16:07:39 937 收藏 8版权SpringBoot有四个注解
Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha1