尝试创建表时,Oracle SQL“无效标识符错误”

时间:2019-12-12 13:31:35

标签: sql oracle

我已经成功构建了这些表:

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和其他一些链接,我仍然试图理解是什么原因导致了问题的产生。

1 个答案:

答案 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)