我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号

I'm getting an error on Oracle Apex ORA-00907: missing right parenthesis

我正在尝试 运行 在 Oracle Apex 中 SQL 的这个片段,并不断收到关于右括号的错误。我试图删除约束或稍后更改 tables,但我不断遇到同样的错误。我似乎无法弄清楚 table 结构有什么问题,而且我在网上找不到任何有意义的信息。任何帮助将不胜感激,谢谢。下面的代码...

DROP TABLE Employee_T
CASCADE CONSTRAINTS;
DROP TABLE TaxDepartment_T
CASCADE CONSTRAINTS;
DROP TABLE Location_T
CASCADE CONSTRAINTS;



CREATE TABLE Employee_T
(
    EmployeeID NUMBER(11) NOT NULL,
    EmployeeName VARCHAR2(25) NOT NULL,
    EmployeeAddress VARCHAR2(30)    ,
    EmployeeCity VARCHAR2(20)    ,
    EmployeeState CHAR(2)         ,
    EmployeePostalCode VARCHAR2(10)    ,
    CONSTRAINT Employee_PK PRIMARY KEY(EmployeeID),
    CONSTRAINT Employee_FK1 FOREIGN KEY(DepartmentID) REFERENCES (TaxDepartment_T),
    CONSTRAINT Employee_FK2 FOREIGN KEY(BranchID) REFERENCES (Location_T)
);



CREATE TABLE TaxDepartment_T
(
    DepartmentID INTEGER(11) NOT NULL,
    BranchID INTEGER(11) NOT NULL,
    CPAID INTEGER(11) NOT NULL,
    EmployeeID INTEGER(11) NOT NULL,
    BranchName VARCHAR2(50) NOT NULL,
    CONSTRAINT TaxDepartment_PK PRIMARY KEY(DepartmentID, BranchID, CPAID),
    CONSTRAINT TaxDepartment_FK1 FOREIGN KEY(BranchID) REFERENCES (Location_T),
    CONSTRAINT TaxDepartment_FK2 FOREIGN KEY(EmployeeID) REFERENCES (Employee_T)
);



CREATE TABLE Location_T
(
    BranchID INTEGER(11) NOT NULL,
    BranchName VARCHAR2(50) NOT NULL,
    ManagerName VARCHAR2(50) NOT NULL,
    EmployeeID INTEGER(11) NOT NULL,
    CONSTRAINT Location_PK PRIMARY KEY(BranchID),
    CONSTRAINT Location_FK1 FOREIGN KEY(EmployeeID) REFERENCES (Employee_T)
);

您应该在 TaxDepartment_TLocation_T 表中使用 NUMBER 而不是 INTEGER

您的外键约束语法已关闭。

它应该是什么样子:

REFERENCES SCHEMA.TABLE (COLUMN)

你只有:

REFERENCES (COLUMN)

如果您在 SQL Developer 中查看此代码,解析器会立即发现您的问题,甚至让您只需单击一下即可访问带有用于定义 FK 约束的语法图的文档。

这是你的第一个问题。

bug 的乐趣在于杀死一个只会暴露下一个。您不能为尚未创建的表创建 FK 约束。因此,您要么需要先创建基表,要么需要从 CREATE TABLE 调用中删除 FK 约束,然后再将它们添加回

alter table TABLE_NAME add constraint CONSTRAINT_NAME foreign key(COLUMN_NAME) references TABLE_NAME2(COLUMN_NAME)

一旦创建了所有表,将所有这些 ALTER TABLE ADD CONSTRAINT 调用放在脚本的末尾。

其他人也注意到您使用的是 INTEGER。

我一直这样做...因为我懒得打字 'NUMBER(38,0)'

没关系。但是你不能做的是说 INTEGER(9)。 That makes no sense in Oracle

存在一些语法问题。

  • integer 可以,但 integer(11) 不行。使用 number(11)。 (此外,虽然 char 是有效类型,但对于 avoid unexpected behaviour 的字符串,您应该坚持标准 varchar2。)

  • 外键约束写成constraint fk references tablename,或者您可以选择在括号中指定引用的列:constraint fk references tablename (columnname)。 (此外,如果您将它们内联写入列定义的一部分,则可以让数据类型从父级继承。)

  • Employee FK1 和 FK2 指的是 table 没有的 DepartmentID 和 BranchID 列。

  • 如果你想运行它作为一个脚本,你需要把父项放在子项之前。

我会这样写:

drop table employee_t cascade constraints;
drop table taxdepartment_t cascade constraints;
drop table location_t cascade constraints;

create table Location_T
( BranchID           number(11) not null constraint Location_PK primary key
, BranchName         varchar2(50) not null
, ManagerName        varchar2(50) not null );

create table TaxDepartment_T
( DepartmentID       number(11) not null
, BranchID           constraint TaxDepartment_Location_FK references location_t not null
, CPAID              number(11) not null
, BranchName         varchar2(50) not null
, constraint TaxDepartment_PK primary key(DepartmentID, BranchID, CPAID) );

create table Employee_T
( EmployeeID         number(11) not null constraint Employee_PK primary key
, EmployeeName       varchar2(25) not null
, EmployeeAddress    varchar2(30)
, EmployeeCity       varchar2(20)
, EmployeeState      varchar2(2)
, EmployeePostalCode varchar2(10)
, DepartmentID       constraint Employee_Department_FK references location_t
, BranchID           constraint Employee_Branch_FK references Location_T );

我认为位置或税务部门不应该有 EmployeeId 列,所以我删除了它们 - 如果您认为那是错误的,请说出来。

就我个人而言,我不会将 _T 放在我的 table 名称的末尾,并且我会避免驼峰命名,因为数据字典不保留它,因此描述一个 table 例如给出:

SQL> @desc location_t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 BRANCHID                                  NOT NULL NUMBER(11)
 BRANCHNAME                                NOT NULL VARCHAR2(50)
 MANAGERNAME                               NOT NULL VARCHAR2(50)