我无法创建外键:缺少右括号错误

I can't create a foreign key: missing right parenthesis error

CREATE TABLE hotel_reservation(
    hotel_code VARCHAR2(5),
    room_type  VARCHAR2(75), CONSTRAINT check_room_type CHECK(room_type LIKE 'DELUXE' or room_type LIKE 'SUPERIOR' or room_type LIKE 'MASTERS SUITE') NOT NULL, 
    room_id number(3), CONSTRAINT fk_room_id FOREIGN KEY(room_id) REFERENCES rooms(room_id) NOT NULL
);

它一直说缺少右括号,但我没有看到缺少任何东西。

问题是最后的NOT NULL。这是表达此定义的一种方式:

CREATE TABLE hotel_reservation (
    hotel_code VARCHAR2(5),
    room_type  VARCHAR2(75)  NOT NULL,
    CONSTRAINT check_room_type CHECK (room_type in ('DELUXE', 'SUPERIOR', 'MASTERS SUITE')), 
    room_id number(3) NOT NULL,
    CONSTRAINT fk_room_id FOREIGN KEY (room_id) REFERENCES rooms(room_id)
);

我还更改了第一个 check 约束以使用 in 而不是 ors。

我更喜欢保留约束 out-of-line,或者 - 也许/有时甚至更好 - 在 CREATE TABLE 脚本之外。为什么?如有必要,重新创建它们会更容易。

一个选项:

CREATE TABLE hotel_reservation
(
   hotel_code   VARCHAR2 (5),
   room_type    VARCHAR2 (75) NOT NULL,
   room_id      NUMBER (3) NOT NULL,
   --
   CONSTRAINT check_room_type CHECK
      (   room_type LIKE 'DELUXE'
       OR room_type LIKE 'SUPERIOR'
       OR room_type LIKE 'MASTERS SUITE'),
   CONSTRAINT fk_room_id FOREIGN KEY (room_id) REFERENCES rooms (room_id)
);

还有一个:

CREATE TABLE hotel_reservation
(
   hotel_code   VARCHAR2 (5),
   room_type    VARCHAR2 (75) NOT NULL,
   room_id      NUMBER (3) NOT NULL
);

ALTER TABLE hotel_reservation ADD
  CONSTRAINT check_room_type CHECK
      (   room_type LIKE 'DELUXE'
       OR room_type LIKE 'SUPERIOR'
       OR room_type LIKE 'MASTERS SUITE');

ALTER TABLE hotel_reservation ADD
  CONSTRAINT fk_room_id FOREIGN KEY (room_id) 
  REFERENCES rooms (room_id);

我更喜欢 single-column 与列内联的约束,因为它是一种更紧凑的语法,而且您还可以让子 table 从父继承其数据类型。

-- Parent table for demo purposes:
create table rooms
( room_id integer primary key );

create table hotel_reservation
( hotel_code varchar2(5)  -- Probably this should be mandatory and a FK to hotels
, room_type  varchar2(75) not null
             constraint check_room_type check (room_type in ('DELUXE','SUPERIOR','MASTERS SUITE'))
, room_id    not null constraint fk_room_id references rooms(room_id) );

注意 hotel_reservation.room_idrooms.room_id 继承其数据类型。

创建 TABLE hotel_reservation( hotel_code VARCHAR(5), room_type VARCHAR(75),

room_id整数, CONSTRAINT fk_room_id FOREIGN KEY(room_id) REFERENCES rooms(room_id) , 约束检查_room_type 检查( room_type 喜欢 'DELUXE' 或 room_type 喜欢 'SUPERIOR' 或 room_type 喜欢 'MASTERS SUITE' ) );

NOT Null 用于定义列。不适用于约束