我无法创建外键:缺少右括号错误
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
而不是 or
s。
我更喜欢保留约束 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_id
从 rooms.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 用于定义列。不适用于约束
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
而不是 or
s。
我更喜欢保留约束 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_id
从 rooms.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 用于定义列。不适用于约束