我想检查用户的生日应该大于18岁。我使用了下面提到的检查约束。
(FLOOR((MONTHS_BETWEEN(DOB,SYSDATE))/12))>=18
DOB:生日的表格中的字段。
但发生了以下错误:
DOB是无效的标识符。
感谢名单!
答案 0 :(得分:4)
在Oracle中,您不能在CHECK约束中引用系统变量。事实上,如果任何 SQL dbms允许,我会有点惊讶,因为它使约束不确定。
我可以想到几种在数据库级别解决它的方法。
答案 1 :(得分:1)
Oracle文档明确指出,只有确定性函数才能用于检查约束;明确禁止sysdate
,systimestamp
等。 Find out more.
解决此限制的一种常见方法是利用数据模型。例如,您的USERS表是否有REGISTRATION_DATE?它当然应该有类似的东西。自然REGISTRATION_DATE默认为sysdate
,而且!你的约束变得合法:
(FLOOR((MONTHS_BETWEEN(REGISTRATION_DATE, DOB))/12))>=18
顺便提一下,注意MONTHS_BETWEEN()
的参数顺序是(later_date,更早的日期)。 Check it out