oracle 约束的novalidate 应用

在项目开发过程中,遇到这样一个需求:

在tb_test表中加入触发器,实现如下规则检查
MIN>0,
MAX>MIN

如果insert或update时,数据违反规则,则抛出错误,sql语句执行不成功

这个功能用触发器可以实现,脚本如下:

create or replace trigger t_tb_test
  before insert or update on TB_test
  for each row
declare
  v_min number;

 v_diff number;

begin
  v_min:=:NEW.min;

 v_diff:=:NEW.MAX-:NEW.MIN

if v_MIN<=0 then
 RAISE_APPLICATION_ERROR(-20001,'min must bigger zero');
end if;

if v_diff<=0 then
 RAISE_APPLICATION_ERROR(-20001,'diff must bigger zero');
end if;
end t_tb_test;

但是考虑触发器对性能影响比较大,

改用oracle 自带的约束功能也可以实现 ,而且脚本简单

alter table TB_test
  add constraint GAME_TABle_test
  check (max>min);
alter table TB_test
  add constraint GAME_TABLE_test
  check (min>0);

但是在实施脚本时,报错:

ora-02290:check_constraint(gr.tb_test) violated

一检查发现有发现有历史数据不符合约束规则;

所以必须用 novalidate 功能,才能加上去 脚本如下:

alter table TB_test
  add constraint GAME_TABLE_test
  check (min>0) NOVALIDATE;

 

 

请使用浏览器的分享功能分享到微信等