database - 我的 Oracle 10gr2 检查约束有什么问题?试图强制执行日期范围

标签 database oracle constraints date

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

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

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

有没有办法使用 CHECK 约束而不是触发器来完成此操作?

最佳答案

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

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

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

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

关于database - 我的 Oracle 10gr2 检查约束有什么问题?试图强制执行日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/207025/

相关文章:

sql - 如何显示消息而不是 NULL

c++ - 单元测试模板代码

oracle - Kafka SMT ValueToKey - 如何使用多个值作为键?

asp.net - ORA-01036 : illegal variable name/number C# (SqlDataSource) Oracle 11g

java - 您如何协调现有生产数据与 App Engine 中的架构更改?

c++ - 获取 QSqlError ("", "", "") 但数据已插入

database - oracle - 违反完整性约束 - 找到子记录

c# - Curiously Recurring Template Pattern 和泛型约束 (C#)

database - 使用 Excel 作为 ODBC 数据库

mysql - 当我选择更新的开始行和结束行时,mysql 会锁定一系列行吗?