Oracle ->> ENABLE VALIDATE & DISABLE VALIDATE

本文详细解析了数据库中约束的三种不同状态:禁用验证(DISABLE VALIDATE)、启用验证(ENABLE VALIDATE)与启用不验证(ENABLE NOVALIDATE)。通过具体实例展示了在不同状态下插入数据时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里找到一篇博文对这两个用法的解释:http://www.cnblogs.com/rootq/archive/2008/09/23/1297400.html

启用约束:

enable( validate) :启用约束,创建索引,对已有及新加入的数据执行约束. e

enable novalidate :启用约束,创建索引,仅对新加入的数据强制执行约束,而不管表中的现有数据. 

 

禁用约束:

disable( novalidate):关闭约束,删除索引,可以对约束列的数据进行修改等操作.

disable validate :关闭约束,删除索引,不能对表进行 插入/更新/删除等操作.

 

这里自己做了下实验,也确实验证上面的说法。

下面是DISABLE VALIDATE的实验结果

declare 
      num   number; 
begin 
      select count(1) into num from all_tables where TABLE_NAME = 'TEST2'; 
      if   num=1   then 
          execute immediate 'drop table TEST2'; 
      end   if; 
end; 
/

create table Test2(
col1 int CONSTRAINT cons_test2_1 NOT NULL CHECK(col1>10) DISABLE VALIDATE,
col2 varchar(100) null
);
/

insert into Test2(col1,col2) values(1,'a');

在行 32 上开始执行命令时出错:
insert into Test2(col1,col2) values(1,'a')
命令出错, 行: 32 列: 1
错误报告:
SQL 错误: ORA-25128: 不能对带有禁用和验证约束条件 (SYSTEM.SYS_C009875) 的表进行插入/更新/删除
25128. 00000 -  "No insert/update/delete on table with constraint (%s.%s) disabled and validated"
*Cause:    Try to insert/update/delete on table with DISABLE VALIDATE constraint.
*Action:   Change the constraint's states.


下面是ENANLE VALIDATE的实验结果

declare 
      num   number; 
begin 
      select count(1) into num from all_tables where TABLE_NAME = 'TEST2'; 
      if   num=1   then 
          execute immediate 'drop table TEST2'; 
      end   if; 
end; 
/

create table Test2(
col1 int CONSTRAINT cons_test2_1 NOT NULL CHECK(col1>10) ENABLE VALIDATE,
col2 varchar(100) null
);
/

insert into Test2(col1,col2) values(1,'a');

在行 32 上开始执行命令时出错:
insert into Test2(col1,col2) values(1,'a')
错误报告:
SQL 错误: ORA-02290: 违反检查约束条件 (SYSTEM.SYS_C009877)
02290. 00000 -  "check constraint (%s.%s) violated"
*Cause:    The values being inserted do not satisfy the named check
          
*Action:   do not insert values that violate the constraint.


下面是ENABLE NOVALIDATE的实验结果。

declare 
      num   number; 
begin 
      select count(1) into num from all_tables where TABLE_NAME = 'TEST2'; 
      if   num=1   then 
          execute immediate 'drop table TEST2'; 
      end   if; 
end; 
/

create table Test2(
col1 int,
col2 varchar(100) null
);
/

insert into Test2(col1,col2) values(1,'a');
/

alter table Test2 add CONSTRAINT cons_test2_1 CHECK(col1>10) ENABLE NOVALIDATE;
/

select * from Test2;
/

insert into Test2(col1,col2) values(2,'b');

table TEST2 已创建。 1 行已插入。 table TEST2已变更。 >>Query Run In:查询结果 1

在行 41 上开始执行命令时出错: insert into Test2(col1,col2) values(2,'b') 错误报告: SQL 错误: ORA-02290: 违反检查约束条件 (SYSTEM.CONS_TEST2_1) 02290. 00000 -  "check constraint (%s.%s) violated" *Cause:    The values being inserted do not satisfy the named check            *Action:   do not insert values that violate the constraint.

 

转载于:https://www.cnblogs.com/jenrrychen/p/4604996.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值