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

Posted

技术标签:

【中文标题】尝试创建表时 Oracle SQL “无效标识符错误”【英文标题】:Oracle SQL "invalid identifier error" when trying to create a table 【发布时间】:2019-12-12 13:31:35 【问题描述】:

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

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 和其他一些链接,我也没有设法解决问题。

【问题讨论】:

参考表(tnum)... 【参考方案1】:

您可以直接在列之后指定列级别约束,但是您必须去掉逗号和foreign key 部分,因为很明显是哪一列。

但您需要在外键定义中包含主键的所有列。而且由于客户表的主键由两列组成,因此您不能在订单表中使用内联外键。

外键“references”部分需要在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)

【讨论】:

以上是关于尝试创建表时 Oracle SQL “无效标识符错误”的主要内容,如果未能解决你的问题,请参考以下文章

尝试查看表时 Oracle SQL Developer 没有响应(或建议使用 Oracle Mac 客户端)

创建表时绑定变量?

mysql.connector.errors.ProgrammingError: 1064 (42000): 尝试创建表时 SQL 语法有错误

在 Oracle SQL 中删除表

Oracle 中的外键创建问题

在sql创建数据库表时,如何为字段设一个默认值