列检查约束不能引用oracle数据库中的其他列

column check constraint cannot reference other columns in oracle database

我研究这个错误已经有一段时间了,也阅读了其他相关文章,但似乎无法找到它给出错误原因的答案

column check constraint cannot reference other columns

CREATE TABLE reservations
(member_id CHAR(7)
CONSTRAINT res_memberid_pk PRIMARY KEY
CONSTRAINT res_memberid_fk REFERENCES members(member_id)
,date_sh DATE DEFAULT SYSDATE
CONSTRAINT res_datesh_ck CHECK(date_sh < TO_DATE ("23:00","hh24:mi"))
,terrain NUMBER(2)
CONSTRAINT res_ter_nn NOT NULL
,opponent_id CHAR(7)
CONSTRAINT res_opid_fk REFERENCES members(member_id)
);

双引号表示标识符。单引号用于文本文字。

你想要:

TO_DATE ('23:00','hh24:mi')

TO_DATE ('23:00','hh24:mi') 将是当月第一天的 23:00(这可能是您想要的,也可能不是您想要的)。但是,它不会在检查约束中工作,因为它没有指定年、月和日组件,并且会抛出:

ORA-02436: date or system variable wrongly specified in CHECK constraint

如果要对其进行约束,使日期的时间分量小于 23:00,则:

CONSTRAINT res_datesh_ck CHECK(EXTRACT(HOUR FROM CAST(date_sh AS TIMESTAMP)) < 23)

db<>fiddle here

是的,一个约束可以引用另一个列,它被称为“FOREIGN KEY CONSTRAINT”。网上有很多关于语法的例子——它与你写的有点不同……你需要定义列,然后在该列上设置一个约束,表明它是一个外键并引用另一个 table。例如(简化后,只有成员 table 和保留 table 以及对成员的外键约束:

create table members (
    member_id                      number generated by default on null as identity 
                                   constraint members_member_id_pk primary key
)
;

create table reservations (
    reserveration_id               number generated by default on null as identity 
                                   constraint reservations_reserveration_pk primary key,
    member_id                      number
                                   constraint reservations_member_id_fk
                                   references members on delete cascade
)
;


请注意,在名为“reservations”的 table 中将主键列命名为“member_id”非常令人困惑。