我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号
Posted
技术标签:
【中文标题】我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号【英文标题】:I'm getting an error on Oracle Apex ORA-00907: missing right parenthesis 【发布时间】:2020-05-11 22:47:05 【问题描述】:我正在尝试在 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)
);
【问题讨论】:
integer
可以,但integer(11)
不行。使用number(11)
。此外,虽然char(2)
有效,但您应该使用字符串的标准类型varchar2(2)
。
所有references(table name)
约束都应该是references tablename
或references tablename (columnname)
。为什么税务部门和地点有员工 ID? Employee FK1 和 FK2 还引用了表中没有的 DepartmentID
和 BranchID
列。
【参考方案1】:
您的外键约束语法已关闭。
它应该是什么样子:
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。
【讨论】:
【参考方案2】:您应该在TaxDepartment_T
和Location_T
表中使用NUMBER
而不是INTEGER
【讨论】:
整数也可以,只是Oracle中number(38,0)的别名。integer
很好,但integer(11)
给出“ORA-00907:缺少右括号”。【参考方案3】:
存在一些语法问题。
integer
可以,但integer(11)
不行。使用number(11)
。 (另外,虽然char
是有效类型,但对于avoid unexpected behaviour 的字符串,您应该坚持使用标准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 );
我认为 Location 或 Tax Department 不应该有 EmployeeId
列,所以我删除了它们 - 如果你认为这是错误的,请说。
就我个人而言,我不会将_T
放在表名的末尾,并且我会避免使用驼峰命名法,因为数据字典不保留它,因此描述表给出了示例:
SQL> @desc location_t
Name Null? Type
----------------------------------------- -------- ----------------------------
BRANCHID NOT NULL NUMBER(11)
BRANCHNAME NOT NULL VARCHAR2(50)
MANAGERNAME NOT NULL VARCHAR2(50)
【讨论】:
以上是关于我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章
从 DB2 移植到 ORACLE - ORA-00907:缺少右括号
Oracle Live SQL:ORA-00907:缺少右括号 -