我在 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_T
和 Location_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)
我正在尝试 运行 在 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_T
和 Location_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)