ORA-00904: : 无效标识符

3

我正在尝试在Oracle中创建一个表,但出现了错误:ORA-00904: : invalid identifier

这是我的命令。我真的看不出有什么问题。请帮我找出错误。谢谢。

CREATE TABLE Sale (
CustomerId INT NOT NULL ,
BarCode INT NOT NULL ,
SalesId INT NOT NULL ,
Date DATE NULL ,
CheckOut TINYINT(1) NULL ,
PRIMARY KEY (CustomerId, BarCode, SalesId) ,
CONSTRAINT fk_Customer_has_Product_Customer
FOREIGN KEY (CustomerId )
REFERENCES Customer (CustomerId )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Customer_has_Product_Product1
FOREIGN KEY (BarCode )
REFERENCES Product (BarCode )
ON DELETE NO ACTION
ON UPDATE NO ACTION);

3
你是否正在尝试创建一个名为"Date"的列,这是一个保留字吗?如果你使用不同的名称或在列名周围加上引号,会发生什么? - Joe
3
这肯定会引起另一个问题。但不要用引号将其括起来,改个名称即可。一旦你在它周围加上引号,你就必须永远引用带有大小写敏感性的引号:从销售中选择“日期”... - Tony Andrews
2
你可以尝试逐个删除语句中的约束和列,直到找出引起错误的那个。 - Dave Costa
@Dave - 哦,没错,老式的调试,这是一个好主意! - Tony Andrews
除了这些问题,需要注意的是Oracle会将您的名称转换为大写。因此,SalesID将变成SALESID。如果您想要SalesId成为实际名称,则需要将其用双引号引起来,如“SalesId”。正如Tony所提到的,这是一个痛点,这就是为什么我看到的大多数Oracle命名都使用下划线约定,例如SALES_ID。 - Jim Hudson
我也遇到了同样的问题。我尝试将日期作为列名。我想知道为什么Oracle对此如此挑剔,而MSSQL和MySQL却毫不抱怨? - sweet dreams
2个回答

9

Oracle标识符的最大长度为30个字符。以下两个标识符超过了此限制,长度为32个字符:

  • fk_Customer_has_Product_Customer
  • fk_Customer_has_Product_Product1

请参见模式对象命名规则


8

如先前提到的,将"DATE"更改为更具描述性且未被保留的内容。另外,在创建表时似乎TINYINT不起作用,因此将其更改为NUMBER(1),并采纳Tony减少名称长度(<=30个字符)的正确建议。

CREATE TABLE Sale
(
    CustomerId INT NOT NULL                    ,
    BarCode    INT NOT NULL                    ,
    SalesId    INT NOT NULL                    ,
    SaleDate DATE NULL                    , --DATE is reserved, changed to SaleDate
    CheckOut number(1) NULL               , --tinyint(1) did not work so changed to number(1)
    PRIMARY KEY( CustomerId, BarCode, SalesId )     ,
    CONSTRAINT fk_SaleCustCusID FOREIGN KEY( CustomerId ) REFERENCES Customer( CustomerId ) ON
    DELETE NO ACTION ON
    UPDATE NO ACTION,
    CONSTRAINT fk_SaleCustBarCode FOREIGN KEY( BarCode ) REFERENCES Product( BarCode ) ON
    DELETE NO ACTION ON
    UPDATE NO ACTION
);

我也遇到了同样的问题。我尝试使用"date"作为一个列名。我想知道为什么Oracle对此如此挑剔,而MSSQL和MySQL却可以接受它而不抱怨? - sweet dreams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接