-1

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

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

DOB:表中的字段用于生日。

但发生了以下错误:

DOB 是无效的标识符。

谢谢!

4

2 回答 2

4

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

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

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

CHECK 约束的限制

于 2013-03-02T10:21:02.350 回答
1

Oracle 文档明确指出,在检查约束上只允许使用确定性函数;sysdatesystimestamp是明确禁止的。 了解更多。

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

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

顺便说一下,注意参数的顺序MONTHS_BETWEEN()是(later_date,更早的日期)。 检查出来

于 2013-03-03T10:01:23.103 回答