3

我想对日期范围强制执行 CHECK 约束,以使 BIRTH_DATE 列中的所有日期都小于明天且大于或等于 100 年前。我在 CHECK 约束中尝试了这个表达式:

BIRTH_DATE >= (sysdate - numtoyminterval(100, 'YEAR')) AND BIRTH_DATE < sysdate + 1

但我收到错误“ORA-02436:在 CHECK 约束中错误指定日期或系统变量”

有没有办法使用 CHECK 约束而不是触发器来实现这一点?

4

2 回答 2

5

至于 Oracle 为何做出此限制:检查约束必须始终评估为 TRUE,即使对于更新也是如此。如果您将 99 岁的人添加到数据库中,然后尝试在 2 年后更新此人的电子邮件地址(例如),您将收到检查约束违规。

如果合适的话,你可以做的是有另一个默认为 SYSDATE 的列 CREATED_DATE,并进行约束:

BIRTH_DATE >= (CREATED_DATE - numtoyminterval(100, 'YEAR')) 
AND BIRTH_DATE < CREATED_DATE + 1

但是,如果您真的只想在 INSERT 时执行检查,请在数据库触发器或 API 代码中执行。

于 2008-10-16T11:01:37.443 回答
3

检查约束表达式必须是确定性的,因此这种滑动日期范围在检查约束中是不可执行的。来自SQL 参考

检查约束条件不能包含以下结构:

* Subqueries and scalar subquery expressions
* Calls to the functions that are not deterministic (CURRENT_DATE,

CURRENT_TIMESTAMP、DBTIMEZONE、LOCALTIMESTAMP、SESSIONTIMEZONE、SYSDATE、SYSTIMESTAMP、UID、USER 和 USERENV)

于 2008-10-16T01:05:04.840 回答