问题描述
ORA-00904: 无效标识符 00904. 00000 - "%s: 无效标识符"
CREATE TABLE Staff (
staffNo VARCHAR2(5),fName VARCHAR2(10),lName VARCHAR2(10),position VARCHAR2(10),dob DATE,salary NUMBER(7,2) NOT NULL,branchNo CHAR(4),supervisor VARCHAR2(5),CONSTRAINT Staff_PK PRIMARY KEY (staffNo),CONSTRAINT Staff_AK UNIQUE (fName,lName,branchNo),CONSTRAINT Staff_FK FOREIGN KEY (branchNo) REFERENCES Branch (branchNo),CONSTRAINT Staff_pos CHECK (position IN ('Manager','Supervisor')),CONSTRAINT Staff_fName CHECK (NOT (fname IS NULL)),CONSTRAINT Staff_lName CHECK (lName IS NOT NULL),CONSTRAINT Staff_branch CHECK (branchNo IS NOT NULL),CONSTRAINT Staff_position <> 'manager' OR 'supervisor' IS NULL,CONSTRAINT 'A staff member can supervise up to 10 others.',CONSTRAINT 'A staff member who supervises others is in the position of supervisor or
manager'
);
我认为这个问题可能与限制有关,但我不确定。这是我第一次编码和使用 Oracle。任何帮助/指导将不胜感激。
解决方法
您是否在尝试创建表 STAFF 之前创建表 BRANCH?
如果是,那么这应该有效。
如果否,则首先从 STAFF 表定义中删除 CONSTRAINT Staff_FK FOREIGN KEY (branchNo) REFERENCES Branch (branchNo)
创建表 BRANCH,将创建 STAFF 表。
您可以在创建 BRANCH TABLE 后使用 ALTER TABLE STAFF 语句添加 CONSTRAINT Staff_FK FOREIGN KEY (branchNo) REFERENCES Branch (branchNo)
。
“REFERENCES Branch (branchNo)”需要表分支以实现参照完整性,并且最好定义一列 NOT NULL 而不是使用 CHECK 来避免 NULLS。
CREATE TABLE Staff (
staffNo VARCHAR2(5),fName VARCHAR2(10) NOT NULL,lName VARCHAR2(10) NOT NULL,position VARCHAR2(10) NOT NULL,DOB DATE,salary NUMBER(7,2) NOT NULL,branchNo CHAR(4) NOT NULL,supervisor VARCHAR2(5),CONSTRAINT Staff_PK PRIMARY KEY (staffNo),CONSTRAINT Staff_AK UNIQUE (fName,lName,branchNo),CONSTRAINT Staff_FK FOREIGN KEY (branchNo) REFERENCES Branch (branchNo),CONSTRAINT Staff_pos CHECK( position IN ('Manager','Supervisor')),CONSTRAINT Staff_position CHECK (position <> 'manager' OR supervisor IS NULL)
/* CONSTRAINT 'A staff member can supervise up to 10 others.',CONSTRAINT 'A staff member who supervises others is in the position of supervisor or manager' -- you need a trigger for these)*/
);
为此,“一名工作人员最多可以监督 10 人。”您不能直接在表定义中创建某些内容。 您可以尝试使用触发器将主管下的员工人数限制为 10 人。