我正在尝试在GP数据库中创建一个条件,我必须只能插入等于或大于今天日期的约会。
查询:
CREATE TABLE Appointment_Table(
AppointmentID Number(6) NOT NULL Primary Key,
DateAndTime Timestamp(0) NOT NULL,
Check (DateAndTime >= (SYSDATE, 'MM-DD-YYYY HH24:MI:SS')));
这是我得到的错误:
ORA-01797:此运算符必须后跟ANY或ALL
非常感谢任何帮助:)
答案 0 :(得分:5)
数据类型date
足以存储日,小时,分钟和秒。无需timestamp
。此外,primary key
免费为您提供not null
,因此无需指定。{/ p>
使用触发器而不是检查约束,因为Oracle在sysdate
中不允许check
(现在是时间)。
create table a (
id number(6) primary key,
d date not null
);
create or replace trigger t_a_ins before insert on a
for each row when ( new.d < sysdate )
begin raise_application_error( -20000, 'Forbidden!'); end;
/
insert into a values (1, sysdate+1);
insert into a values (2, sysdate-1);
第一个插入没问题。
第二个导致错误ORA-20000: Forbidden!
。选择-20000和-20999之间的数字来定义您自己的ORA错误。
答案 1 :(得分:2)
解决此问题的一种方法是在表格上放置一个填充了当前日期/时间的字段,然后使用检查约束检查“当前日期和时间”字段。我们称之为新字段ADD_DATE。所以你的桌子就变成了:
CREATE TABLE Appointment_Table
(AppointmentID Number(6)
NOT NULL
Primary Key,
DateAndTime Timestamp(0)
NOT NULL,
ADD_DATE DATE
DEFAULT SYSDATE
NOT NULL,
CONSTRAINT APPOINTMENT_TABLE_CK1
CHECK(DateAndTime >= ADD_DATE));
请注意,如SQLFiddle中所示,您不需要为ADD_DATE
提供值,或者甚至在INSERT中提及它。在INSERT语句中省略列时,将应用SYSDATE的缺省值。所以在SQLFiddle中,使用的INSERT语句只提到APPOINTMENTID和DATEANDTIME:
INSERT INTO APPOINTMENT_TABLE (APPOINTMENTID, DATEANDTIME)
VALUES (1, TO_DATE('01-MAY-2017 08:30:00', 'DD-MON-YYYY HH24:MI:SS'));
INSERT INTO APPOINTMENT_TABLE (APPOINTMENTID, DATEANDTIME)
VALUES (2, TO_DATE('01-MAY-2018 17:30:00', 'DD-MON-YYYY HH24:MI:SS'));
执行上述语句后,表格如下:
APPOINTMENTID DATEANDTIME ADD_DATE
1 2018-05-01 08:30:00.0 2018-03-11T03:15:00Z
2 2018-05-01 17:30:00.0 2018-03-11T03:15:00Z
如果您将其中一个DateAndTime
值更改为2017而不是2018,然后执行该语句,您将收到类似于
ORA-02290: check constraint (USER_4_85DBA.APPOINTMENT_TABLE_CK1) violated
这表明约束正在按预期工作。
祝你好运。