Sql I';我在Oracle Apex ORA-00907上遇到一个错误:缺少右括号

Sql I';我在Oracle Apex ORA-00907上遇到一个错误:缺少右括号,sql,oracle,oracle-apex,Sql,Oracle,Oracle Apex,我试图在Oracle Apex中运行这段SQL语句,并不断收到关于右括号的错误。我尝试过以后删除约束或修改表,但我总是出现同样的错误。我似乎无法找出表结构的错误所在,而且我在网上也找不到任何有意义的东西。任何帮助都将不胜感激,谢谢。下面的代码 DROP TABLE Employee_T CASCADE CONSTRAINTS; DROP TABLE TaxDepartment_T CASCADE CONSTRAINTS; DROP TABLE Location_T CASCADE CONSTRA

我试图在Oracle Apex中运行这段SQL语句,并不断收到关于右括号的错误。我尝试过以后删除约束或修改表,但我总是出现同样的错误。我似乎无法找出表结构的错误所在,而且我在网上也找不到任何有意义的东西。任何帮助都将不胜感激,谢谢。下面的代码

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
Location
表中,应使用
NUMBER
而不是
INTEGER
TaxDepartment
Location
表中,应使用
NUMBER
而不是
INTEGER
外键约束语法已关闭

它应该是什么样子的:

REFERENCES SCHEMA.TABLE (COLUMN)
你只需要:

REFERENCES (COLUMN)
如果您在sqldeveloper中查看这段代码,解析器会立即发现您的问题,甚至只需单击一下,就可以访问带有定义FK约束的语法图的文档

这是你的第一个问题

臭虫的乐趣在于杀死一个只会暴露下一个。无法为尚未创建的表创建FK约束。因此,您需要首先创建基表,或者需要从create TABLE调用中删除FK约束,并在稍后将其添加回

alter table TABLE_NAME add constraint CONSTRAINT_NAME foreign key(COLUMN_NAME) references TABLE_NAME2(COLUMN_NAME)
创建完所有表后,将所有这些ALTER TABLE ADD约束调用放在脚本末尾

其他人也注意到您使用的是整数

我一直都这么做,因为我懒得输入“数字(38,0)”


那很好。但是你不能说整数(9)

您的外键约束语法已禁用

它应该是什么样子的:

REFERENCES SCHEMA.TABLE (COLUMN)
你只需要:

REFERENCES (COLUMN)
如果您在sqldeveloper中查看这段代码,解析器会立即发现您的问题,甚至只需单击一下,就可以访问带有定义FK约束的语法图的文档

这是你的第一个问题

臭虫的乐趣在于杀死一个只会暴露下一个。无法为尚未创建的表创建FK约束。因此,您需要首先创建基表,或者需要从create TABLE调用中删除FK约束,并在稍后将其添加回

alter table TABLE_NAME add constraint CONSTRAINT_NAME foreign key(COLUMN_NAME) references TABLE_NAME2(COLUMN_NAME)
创建完所有表后,将所有这些ALTER TABLE ADD约束调用放在脚本末尾

其他人也注意到您使用的是整数

我一直都这么做,因为我懒得输入“数字(38,0)”


那很好。但是你不能说整数(9)

有一些语法问题


  • integer
    正常,但不是
    integer(11)
    。使用编号(11)
。(另外,虽然
char
是有效的类型,但对于要使用的字符串,您应该坚持使用标准的
varchar2
。)

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

  • Employee FK1和FK2引用表中没有的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
    列,所以我删除了它们——如果你认为这是错误的话

    就我个人而言,我不会将
    \u t
    放在表名的末尾,我会避免使用camelCase命名,因为数据字典不会保留它,因此描述表时会给出以下示例:

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

    这里有一些语法问题


    • integer
      正常,但不是
      integer(11)
      。使用编号(11)。(另外,虽然
      char
      是有效的类型,但对于要使用的字符串,您应该坚持使用标准的
      varchar2
      。)

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

    • Employee FK1和FK2引用表中没有的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
    列,所以我删除了它们——如果你认为这是错误的话

    就我个人而言,我不会将
    \u t
    放在表名的末尾,我会避免使用camelCase命名,因为数据字典不会保留它,因此描述表时会给出以下示例:

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

    Integer很好,它只是Oracle中数字(38,0)的别名。
    Integer
    很好,但是
    Integer(11)
    给出了“ORA-00907:缺少右括号”。Integer很好,它只是Oracle中数字(38,0)的别名。
    Integer
    很好,但是
    Integer(11)
    给出了“ORA-00907:缺少右括号”.
    integer
    正常,但不是
    integer(11)
    。使用编号(11)。另外,虽然
    char(2)
    有效,您应该使用字符串的标准类型
    varchar2(2)
    。所有
    引用(表名)
    约束应该是
    引用tablename
    ,或者
    引用tablename(columnname)
    。为什么税务部门和地点有员工ID?此外,员工FK1和FK2引用表中指定的
    DepartmentID
    BranchID