Sql 日期限制

Sql 日期限制,sql,oracle,constraints,create-table,Sql,Oracle,Constraints,Create Table,我需要一个日期的检查约束,以便过去不能输入任何数据。我正在学校项目中使用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); Oracle将check约束解释为对数据的永久约束

我需要一个日期的检查约束,以便过去不能输入任何数据。我正在学校项目中使用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);

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

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


因此,您不能使用
检查
约束来做您想做的事情。您需要使用
insert
触发器进行设置。

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

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


因此,您不能使用
检查
约束来做您想做的事情。您需要使用
insert
触发器来设置它。

您不能在检查约束中使用
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;
/
创建或替换触发器应用程序日期不在过去
在mytable上插入或更新之前
每行
开始
如果(:new.app_date
您不能在检查约束中使用
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;
/
创建或替换触发器应用程序日期不在过去
在mytable上插入或更新之前
每行
开始
如果(:new.app_date
检查这是否可以帮助您:这是否回答了您的问题?除了您的基本问题之外,您的数据模型也被破坏了。通过你对mssql的反复提问,我明白了原因。在oracle中,日期类型定义为时间组件,解析为第二个。你是否使用它取决于你自己,但它是存在的,并且总是被认为是日期价值的一部分。也就是说,将app_时间与app_日期分开(假设app_时间是app_日期当天的时间)只会让你的生活更加复杂。oracle所有处理日期的功能都是基于一天中的时间这一知识和假设构建的。在罗马的时候,看看这是否能帮到你:这能回答你的问题吗?除了您的基本问题之外,您的数据模型也被破坏了。通过你对mssql的反复提问,我明白了原因。在oracle中,日期类型定义为时间组件,解析为第二个。你是否使用它取决于你自己,但它是存在的,并且总是被认为是日期价值的一部分。也就是说,将app_时间与app_日期分开(假设app_时间是app_日期当天的时间)只会让你的生活更加复杂。oracle所有处理日期的功能都是基于一天中的时间这一知识和假设构建的。在罗马时…好的,谢谢你让我知道,microsoft sql Server是否也将检查约束解释为对数据的永久约束?@Ahmed。否。SQL Server仅在数据更改(即更新和插入)时验证约束。好的,感谢您让我知道,microsoft SQL Server是否也将检查约束解释为数据上的永久约束?@Ahmed。否。SQL Server仅在数据更改(即更新和插入)时验证约束。感谢这一点,在什么情况下我会使用检查约束?我是SQL新手,所以对术语不太熟悉。它会在SQL Server上使用吗?谢谢,这很有效,在什么情况下我会使用检查约束?我是SQL新手,所以对术语不太熟悉。它会在SQL服务器上使用吗?