创建Oracle表时出错无效标识符

创建Oracle表时出错无效标识符,oracle,identifier,Oracle,Identifier,我正试图在Oracle11g中创建一个表,但遇到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, CONSTR

我正试图在Oracle11g中创建一个表,但遇到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)
);
我得到的错误是:


我不知道错误在哪里。

我认为问题在于您在列定义期间指定了约束名称。你不能那样做。如果要为约束命名,则应以不同的方式指定约束。 尝试:


如果您面临更多问题,请告诉我您有几个问题;错误的直接原因是这一行:

CONSTRAINT NN_Years NOT NULL,
基于您可能打算在列定义中包含内联的早期命名:

yearsold INTEGER CONSTRAINT NN_Years NOT NULL,
CONSTRAINT CH_Years CHECK (yearsold >= 1),
第二个问题是,列定义中的
speciality
与检查约束中的
speciality
名称不一致;因此,您需要修复列和非空约束名称:

speciality VARCHAR2(50 CHAR) CONSTRAINT NN_Specialty NOT NULL,
修复这些问题,并假设您确实有一个
公司
表,其中包含与此指定的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)  

NN\u年
中,您有
yearold
而不是
yearseld
,以及原始代码的
专业
打字错误。除此之外,这是可行的,但将NOTNULL约束移动到行外检查约束意味着数据字典不知道列不可为空,在
所有选项卡列中以及在描述表时;这看起来很漂亮,但会影响优化器。为了避免这种情况,您可以直接命名NOTNULL约束。首先,我看不出命名NOTNULL约束有什么意义。这似乎给模式设计者带来了负担,但没有任何好处。Oracle无论如何都不会报告自定义名称的冲突,因为它使用ORA-01400无法为此在(列规范)中插入null。(我倒希望外键也有类似的功能。)
speciality VARCHAR2(50 CHAR) CONSTRAINT NN_Specialty NOT NULL,
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)