创建Oracle表时出错无效标识符
我正试图在Oracle11g中创建一个表,但遇到ORA-00904错误。创建表的语法为:创建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
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)