【问题标题】:Date constraint日期限制
【发布时间】:2020-07-02 13:06:23
【问题描述】:

我需要一个日期检查约束,因此不能输入过去的数据。我正在为学校项目使用 oracle live SQL,但找不到解决方案。

(BookingID Varchar2(6) PRIMARY KEY NOT NULL,
App_Date Date NOT NULL, 
App_Time varchar2(8) NOT NULL,
Location Varchar2(15) NOT NULL, 
Query Varchar(50) NOT NULL);

【问题讨论】:

  • 检查这是否可以帮助您:stackoverflow.com/questions/5332562/…
  • 这能回答你的问题吗? Using date in a check constraint, Oracle
  • 除了您的基本问题外,您的数据模型已损坏。随着您对 mssql 的反复提问,我明白了原因。在 oracle 中,DATE 类型具有 - 根据定义 - 一个时间组件,解析到秒。是否使用它取决于您,但它存在并且始终被视为 DATE 值的一部分。也就是说,将 app_time 与 app_date 分开(假设 app_time 是 app_date 的时间)只会让您的生活更加复杂。处理 DATE 的所有 oracle 函数都是在涉及一天中的时间的知识和假设下构建的。在罗马时...

标签: sql oracle constraints create-table


【解决方案1】:

Oracle 将check 约束解释为对数据的永久约束。也就是说,检查约束不仅在数据更改时有效,而且在此后永远有效。

因此,Oracle 不允许在check 约束中使用易失函数。易失函数是其值可以随时间变化的函数。一个很好的例子是日期/时间函数,例如sysdate(实际上是一个没有括号的函数)。

所以,你不能用check 约束做你想做的事。您需要使用insert 触发器进行设置。

【讨论】:

  • 好的,感谢您告诉我,Microsoft sql 服务器是否也将检查约束解释为对数据的永久约束?
  • @Ahmed 。 . .不会。SQL Server 仅在数据更改(即更新和插入)时验证约束。
【解决方案2】:

您不能在检查约束中使用sysdate,因为正如 Gordon Linoff 所解释的,它是一个非确定性函数(即它给出的值不会随时间变化)。

相反,您可以使用触发器实现验证:

create or replace trigger app_date_not_in_past
    before insert or update on mytable
    for each row
begin
    if (:new.app_date < sysdate)
    then
        raise_application_error( -20001, 'app_date date must not  be in the past' );
    end if;
end;
/

【讨论】:

  • 谢谢这个工作,在什么情况下我会使用检查约束?我是 SQL 新手,所以对术语不太了解。它会在 SQL Server 上使用吗?
猜你喜欢
  • 2012-09-09
  • 2020-08-10
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多