【问题标题】:"Missing Keyword" When creating a table in Oracle SQL Developer在 Oracle SQL Developer 中创建表时出现“缺少关键字”
【发布时间】:2015-11-01 15:38:22
【问题描述】:

我一直在努力

“CREATE TABLE”中的“SQL 错误:ORA - 00905:缺少关键字”

我的部分代码如下所示:

    CREATE TABLE Orders (
    Received CHAR(9),
    Shipped CHAR(9),
    FOREIGN KEY (Ono), REFERENCES Odetails (Ono),
    FOREIGN KEY (Cno), REFERENCES customers (Cno),
    FOREIGN KEY (Eno), REFERENCES employee (Eno), 
    PRIMARY KEY (Ono, Cno, Eno)
    );

    CREATE TABLE ZIPCODES (
    ZIP CHAR(5) NOT NULL,
    City CHAR(20),
    FOREIGN KEY (ZIP), REFERENCES customers (ZIP),
    PRIMARY KEY (ZIP) 
    );

但是,我在同一个工作表中编写了这段代码,并没有遇到任何错误:

    CREATE TABLE Odetails (
    Ono CHAR(4) NOT NULL,
    Pno CHAR(5) NOT NULL,
    Qty CHAR(1),
    FOREIGN KEY (Pno), REFERENCES parts (Pno),
    PRIMARY KEY (Ono) 
    );

谁能帮我确定导致错误的原因?

【问题讨论】:

    标签: sql database oracle foreign-keys ddl


    【解决方案1】:

    1) 不要使用逗号

    2) 定义列

    CREATE TABLE Orders (
        Received CHAR(9),
        Shipped CHAR(9),
        Ono INT NOT NULL ,   -- your missing columns (add datatype you need)
        Cno INT NOT NULL,
        Eno INT NOT NULL,
        FOREIGN KEY (Ono) REFERENCES Odetails (Ono),  -- here no comma inside
        FOREIGN KEY (Cno) REFERENCES customers (Cno),
        FOREIGN KEY (Eno) REFERENCES employee (Eno), 
        PRIMARY KEY (Ono, Cno, Eno)
        );
    
    CREATE TABLE ZIPCODES (
        ZIP CHAR(5) NOT NULL,
        City CHAR(20),
        FOREIGN KEY (ZIP) REFERENCES customers (ZIP),
        PRIMARY KEY (ZIP) 
        );
    

    考虑使用VARCHAR2 数据类型而不是CHAR

    您也可以使用内联语法,例如:

    CREATE TABLE Orders (
      ...
       Ono INT NOT NULL REFERENCES Odetails (Ono)
      ...
    );
    

    或添加显式约束名称:

    CREATE TABLE Orders (
          ...
           Ono INT NOT NULL,
          ...
          CONSTRAINT FK_Orders_Odetails_Ono  FOREIGN KEY (Ono) REFERENCES Odetails (Ono),
          ...
    );
    

    【讨论】:

    • @kagehana 不客气。勾选答案meta.stackexchange.com/questions/5234/… :)
    • 最好还是使用VARCHAR2,而不是CHAR,因为CHAR会在右侧填充到定义的大小的空白空间,会浪费存储空间。
    • FK 可以内联定义:Ono INT NOT NULL REFERENCES Odetails (Ono)
    • @a_horse_with_no_name 是的,这是一种可能性。我已经用明确的约束名称更新了我的答案+添加的版本
    【解决方案2】:

    删除外键后的comma,使其看起来像:

    CREATE TABLE Orders (
    Received CHAR(9),
    Shipped CHAR(9),
    FOREIGN KEY (Ono) REFERENCES Odetails (Ono),--are you defining this Ono?
    FOREIGN KEY (Cno) REFERENCES customers (Cno),
    FOREIGN KEY (Eno) REFERENCES employee (Eno), 
    PRIMARY KEY (Ono, Cno, Eno)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 2012-09-26
      • 2016-11-09
      • 1970-01-01
      • 2021-01-20
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多