【问题标题】:Error creating Oracle table invalid identifier创建 Oracle 表时出错,无效标识符
【发布时间】:2018-11-13 10:03:56
【问题描述】:

我正在尝试在 Oracle 11g 中创建表,但出现 ORA-00904 错误。创建表的语法是:

CREATE TABLE Worker(
nif VARCHAR2(9 CHAR) CONSTRAINT PK_Nif PRIMARY KEY,
nameworker VARCHAR2(50 CHAR) CONSTRAINT NN_NameWorker NOT NULL,
specialty VARCHAR2(50 CHAR) CONSTRAINT NN_Specialty NOT NULL,
CONSTRAINT CH_Speciality CHECK (speciality ='ENGINEERING' OR speciality= 'SUPPORT' OR speciality='DEVELOPMENT'),
yearsold INTEGER,
CONSTRAINT CH_Years CHECK (yearsold >= 1),
CONSTRAINT NN_Years NOT NULL,
nifCompany VARCHAR2(9 CHAR) CONSTRAINT NN_NifCompany NOT NULL,
CONSTRAINT FK_NifCompany FOREIGN KEY (nifCompany) REFERENCES Company(nif)
);

我得到的错误是:

ORA-00904: : invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:

我不知道错误在哪里。

【问题讨论】:

    标签: oracle identifier


    【解决方案1】:

    你有几个问题;错误的直接原因是这一行:

    CONSTRAINT NN_Years NOT NULL,
    

    根据之前的命名,您可能打算将其包含在列定义中:

    yearsold INTEGER CONSTRAINT NN_Years NOT NULL,
    CONSTRAINT CH_Years CHECK (yearsold >= 1),
    

    第二个问题是名称不一致,列定义中的specialty 与检查约束中的speciality;所以你需要修复列和非空约束名称:

    speciality VARCHAR2(50 CHAR) CONSTRAINT NN_Specialty NOT NULL,
    

    修复这些问题,并假设您确实有一个 Company 表,其中包含与此指定的 FK 匹配的 PK,将为您提供:

    CREATE TABLE Worker(
      nif VARCHAR2(9 CHAR) CONSTRAINT PK_Nif PRIMARY KEY,
      nameworker VARCHAR2(50 CHAR) CONSTRAINT NN_NameWorker NOT NULL,
      speciality VARCHAR2(50 CHAR) CONSTRAINT NN_Specialty NOT NULL,
      CONSTRAINT CH_Speciality CHECK (speciality = 'ENGINEERING'
        OR speciality = 'SUPPORT' OR speciality = 'DEVELOPMENT'),
      yearsold INTEGER CONSTRAINT NN_Years NOT NULL,
      CONSTRAINT CH_Years CHECK (yearsold >= 1),
      nifCompany VARCHAR2(9 CHAR) CONSTRAINT NN_NifCompany NOT NULL,
      CONSTRAINT FK_NifCompany FOREIGN KEY (nifCompany) REFERENCES Company(nif)
    );
    
    Table WORKER created.
    
    desc worker
    
    Name       Null?    Type              
    ---------- -------- ----------------- 
    NIF        NOT NULL VARCHAR2(9 CHAR)  
    NAMEWORKER NOT NULL VARCHAR2(50 CHAR) 
    SPECIALITY NOT NULL VARCHAR2(50 CHAR) 
    YEARSOLD   NOT NULL NUMBER(38)        
    NIFCOMPANY NOT NULL VARCHAR2(9 CHAR)  
    

    【讨论】:

      【解决方案2】:

      我认为问题在于您在列定义期间指定了约束名称。你不能这样做。如果你想给它们命名,你应该以不同的方式指定约束。 试试看:

      CREATE TABLE Worker(
      nif VARCHAR2(9 CHAR) ,
      nameworker VARCHAR2(50 CHAR) ,
      specialty VARCHAR2(50 CHAR),
      CONSTRAINT CH_Speciality CHECK (speciality ='ENGINEERING' OR speciality= 'SUPPORT' OR speciality='DEVELOPMENT'),
      yearsold INTEGER,
      CONSTRAINT CH_Years CHECK (yearsold >= 1),
      CONSTRAINT NN_Years check(yearold is NOT NULL),
      nifCompany VARCHAR2(9 CHAR) ,
      CONSTRAINT FK_NifCompany FOREIGN KEY (nifCompany) REFERENCES Company(nif),
      CONSTRAINT PK_Nif PRIMARY KEY(nif),
      CONSTRAINT NN_NameWorker check(nameworker is NOT NULL),
      CONSTRAINT NN_Specialty check(specialty is NOT NULL),
      CONSTRAINT NN_NifCompany check(nifCompany is NOT NULL)
      );
      

      如果您遇到更多问题,请告诉我

      【讨论】:

      • 您在NN_years 中有yearold 而不是yearsold,以及原始代码中的specialty 错字。除此之外,这是可行的,但是将非空约束移动到线外检查约束意味着数据字典不知道列不可为空,在all_tab_columns 和描述表时;这看起来很漂亮,但它会影响优化器。您可以直接命名非空约束以避免这种情况。
      • 我真的看不出命名 NOT NULL 约束的意义。它似乎只是给模式设计者带来了负担,没有任何好处。无论如何,Oracle 都不会报告自定义名称违规,因为它为此使用了 ORA-01400 Cannot insert null into (column spec)。 (我宁愿希望外键也有类似的东西。)
      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多