我已经成功构建了这些表:
CREATE TABLE Tables
(
tnum NUMBER(4) PRIMARY KEY,
floor NUMBER(1), CHECK (floor >= 0 AND floor <= 4),
capacity NUMBER(2), CHECK(capacity >= 0 AND capacity <= 25),
location VARCHAR(50)
);
CREATE TABLE Customer
(
name VARCHAR(25),
phone VARCHAR(16),
city VARCHAR(25),
PRIMARY KEY(name, phone)
);
CREATE TABLE Menu
(
pid NUMBER(4) PRIMARY KEY,
pname VARCHAR(25),
price NUMBER(4, 1)
);
但,当我尝试构建此版本时,出现错误:
错误报告- ORA-00904::无效的标识符 00904. 00000-“%s:无效的标识符” *原因: *动作:
CREATE TABLE Orders
(
orderid NUMBER(4) PRIMARY KEY,
custname VARCHAR(25),
CONSTRAINT fk_customer
FOREIGN KEY (custname)
REFERENCES Customer(customer.name),
phone VARCHAR(16),
CONSTRAINT fk_customer
FOREIGN KEY(phone)
REFERENCES Customer(customer.phone),
date DATE,
tnum NUMBER(4),
CONSTRAINT fk_tables
FOREIGN KEY(tnum)
REFERENCES Tables(tables.tnum),
numofdiners NUMBER(2)
);
即使我检查了this link和其他一些链接,我仍然试图理解是什么原因导致了问题的产生。
答案 0 :(得分:3)
您可以在列之后直接指定列级别约束,但是您必须摆脱逗号和foreign key
部分,因为这很清楚是哪一列。
但是您需要在外键定义中包括主键的所有列。而且由于客户表的主键由两列组成,因此您不能在表订单中使用内联外键。
外键“引用”部分需要在 target 表中指定表名,但不为表添加前缀(由于references table_xxx
部分,该表已经很清楚了,因此无需在目标列前面加上表名。
此外,DATE
是保留关键字。
CREATE TABLE Orders
(
orderid NUMBER(4) PRIMARY KEY,
custname VARCHAR(25) not null
phone VARCHAR(16) not null,
reservation_date DATE,
tnum NUMBER(4) --<< no comma here!
-- no FOREIGN KEY keyword here
CONSTRAINT fk_tables
REFERENCES Tables(tnum), --<< only the column name between the (...)
numofdiners NUMBER(2), --<< you need a comma before the table level constraints
CONSTRAINT fk_customer
FOREIGN KEY(name, phone) --<< list both columns here
REFERENCES Customer(name, phone) --<< and here
);
请注意,多列外键中的列通过位置而不是名称进行匹配。
因此,以下将是错误
CONSTRAINT fk_customer
FOREIGN KEY(phone, name)
REFERENCES Customer(name, phone)