oracle check 日期大于,sql – 出生日期的CHECK约束?

检查约束必须是确定性的.也就是说,特定行必须始终满足约束,否则它必须始终无法满足约束.但是,由于返回值不断变化,因此SYSDATE本质上是不确定的.因此,您无法定义调用SYSDATE或任何其他用户定义函数的CHECK约束.

如果您尝试在约束定义中引用SYSDATE,则会出现错误

sql> ed

Wrote file afiedt.buf

1 create table t(

2 birth_date date check( birth_date between date '1900-01-01' and

3 sysdate )

4* )

sql> /

sysdate )

*

ERROR at line 3:

ORA-02436: date or system variable wrongly specified in CHECK constraint

您可以创建一个CHECK约束,其中最小和最大日期都是硬编码的,但这不是特别实用,因为您必须不断删除并重新创建约束.

sql> ed

Wrote file afiedt.buf

1 create table t(

2 birth_date date check( birth_date between date '1900-01-01' and

3 date '2011-12-08' )

4* )

sql> /

Table created.

强制执行此类要求的实际方法是在表上创建触发器

CREATE OR REPLACE TRIGGER check_birth_date

BEFORE INSERT OR UPDATE ON employee

FOR EACH ROW

BEGIN

IF( :new.emp_dob < date '1900-01-01' or

:new.emp_dob > sysdate )

THEN

RAISE_APPLICATION_ERROR(

-20001,'EMployee date of birth must be later than Jan 1,1900 and earlier than today' );

END IF;

END;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值