SQL错误代码ORA-00904::标识符00904无效。00000-“百分比”s:无效标识符“;创建带有约束的表时

SQL错误代码ORA-00904::标识符00904无效。00000-“百分比”s:无效标识符“;创建带有约束的表时,sql,oracle,constraints,create-table,ora-00904,Sql,Oracle,Constraints,Create Table,Ora 00904,创建下表时,我得到错误代码 ORA-00904:标识符00904无效。00000-%s:无效标识符 CREATE TABLE Staff( staffNo VARCHAR2(5), fName VARCHAR2(10), lName VARCHAR2(10), 位置VARCHAR2(10), DOB日期, 工资编号(7,2)不为空, branchNo CHAR(4), 主管VARCHAR2(5), 约束Staff_PK主键(staffNo), 约束员工的唯一性(fName、lName、branc

创建下表时,我得到错误代码

ORA-00904:标识符00904无效。00000-%s:无效标识符

CREATE TABLE Staff(
staffNo VARCHAR2(5),
fName VARCHAR2(10),
lName VARCHAR2(10),
位置VARCHAR2(10),
DOB日期,
工资编号(7,2)不为空,
branchNo CHAR(4),
主管VARCHAR2(5),
约束Staff_PK主键(staffNo),
约束员工的唯一性(fName、lName、branchNo),
约束Staff_FK外键(branchNo)引用分支(branchNo),
约束员工检查(位于(‘经理’、‘主管’)中),
约束人员\u fName检查(非(fName为空)),
约束人员名称检查(名称不为空),
分支检查约束(branchNo不为空),
约束员工职位“经理”或“主管”为空,
约束“一名员工最多可以监督10名其他员工。”,
约束“监督他人的员工担任主管或
经理的
);

我认为问题可能与限制有关,但我不确定。这是我第一次编写和使用Oracle。非常感谢您提供的任何帮助/指导。

您是否在创建表格员工之前创建了表格分支? 如果是,那么这应该是可行的。 如果否,则首先从Staff表定义中删除
约束Staff\u FK外键(branchNo)引用分支(branchNo)
,并创建Staff表。 创建分支表后,可以使用ALTERTABLE Staff语句添加约束Staff\u FK外键(branchNo)引用分支(branchNo)

“REFERENCES Branch(branchNo)”需要表分支来实现引用完整性,最好定义一个非NULL列,而不是使用CHECK来避免NULL

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)*/
);
CREATE TABLE Staff(
staffNo VARCHAR2(5),
fName VARCHAR2(10)不为空,
lName VARCHAR2(10)不为空,
位置VARCHAR2(10)不为空,
DOB日期,
工资编号(7,2)不为空,
branchNo字符(4)不为空,
主管VARCHAR2(5),
约束Staff_PK主键(staffNo),
约束员工的唯一性(fName、lName、branchNo),
约束Staff_FK外键(branchNo)引用分支(branchNo),
约束员工检查(位于(‘经理’、‘主管’)中),
约束人员\职位检查(职位“经理”或主管为空)
/*约束“一名员工最多可以监督10名其他员工。”,
约束“监督他人的员工处于主管或经理的位置”——您需要触发这些约束)*/
);
为此,“一名工作人员最多可以管理10名其他人。”您不能直接在表定义中创建内容。
您可以尝试使用触发器将主管领导下的员工人数重新计算为10人。

您认为最后两个约束条件会起什么作用?它们似乎是您需要实现的需求。Oracle显然不知道如何将英语字符串转换为数据模型强制执行的规则。实际上,最后3个约束都是胡说八道,删除它们,您就可以不相关了,但是
varchar2
是字符串的标准类型<代码>字符为。
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)*/
);