检查约束以检查插入的日期

时间:2013-03-02 09:29:32

标签: sql oracle check-constraints

我想检查用户的生日应该大于18岁。我使用了下面提到的检查约束。

(FLOOR((MONTHS_BETWEEN(DOB,SYSDATE))/12))>=18

DOB:生日的表格中的字段。

但发生了以下错误:

  

DOB是无效的标识符。

感谢名单!

2 个答案:

答案 0 :(得分:4)

在Oracle中,您不能在CHECK约束中引用系统变量。事实上,如果任何 SQL dbms允许,我会有点惊讶,因为它使约束不确定。

我可以想到几种在数据库级别解决它的方法。

  • 使用触发器。
  • 使用对今天之前至少18年的日期表的外键引用。你需要一个每天插入一行的工作。但是,时区可能会给你带来一些麻烦。
  • 存储用户声称至少18岁的事实。

Restrictions on CHECK constraints

答案 1 :(得分:1)

Oracle文档明确指出,只有确定性函数才能用于检查约束;明确禁止sysdatesystimestamp等。 Find out more.

解决此限制的一种常见方法是利用数据模型。例如,您的USERS表是否有REGISTRATION_DATE?它当然应该有类似的东西。自然REGISTRATION_DATE默认为sysdate,而且!你的约束变得合法:

(FLOOR((MONTHS_BETWEEN(REGISTRATION_DATE, DOB))/12))>=18

顺便提一下,注意MONTHS_BETWEEN()的参数顺序是(later_date,更早的日期)。 Check it out