【问题标题】:Check constraint on date检查日期约束
【发布时间】:2014-07-16 07:58:13
【问题描述】:

我正在创建一个带有date 列的表。我想添加一个检查约束来验证日期是否在将来。

create table test_table (
  schedule_date date not null,
  check (schedule_date >= TODAY)
);

上面的 sql 给了我一个语法错误。

09:43:37  [CREATE - 0 row(s), 0.000 secs]  [Error Code: -201, SQL State: 42000]  A syntax error has occurred. 
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 1 errors]

如何在日期列上添加约束?

【问题讨论】:

  • 您得到的具体错误是什么?
  • 更新了错误的问题

标签: sql informix check-constraints


【解决方案1】:

您不能在检查约束中使用今天。 正如官方文档所述:

检查约束是使用搜索条件定义的。搜索条件不能包含用户定义的例程、子查询、聚合、主变量或 rowid。此外,条件不能包含变体内置函数 CURRENT、USER、SITENAME、DBSERVERNAME 或 TODAY。

我认为解决方案可以使用插入/更新触发器。

【讨论】:

    【解决方案2】:

    正如 Copilot 所说,Informix 根本不允许这样做。如果任何其他 RDBMS 确实允许这样做,我会感到惊讶。

    当您考虑它时,固有的定时炸弹应该是显而易见的。插入时的行满足约束,但随着时间的推移将失败约束。引擎如何标记?

    解决办法是:

    • 负责创建要插入的行的应用程序负责对其进行预验证,或者
    • 创建一个插入触发器,该触发器在触发时执行验证过程,并在行失败时引发相应的错误

    【讨论】:

      【解决方案3】:

      我没有要检查的 informix 数据库,但我认为逗号是多余的,会导致您的语法错误。

      试试

      create table test_table (
        schedule_date date not null CHECK (schedule_date >= TODAY)
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2022-01-14
        相关资源
        最近更新 更多