Sql I';我在Oracle Apex ORA-00907上遇到一个错误:缺少右括号
我试图在Oracle Apex中运行这段SQL语句,并不断收到关于右括号的错误。我尝试过以后删除约束或修改表,但我总是出现同样的错误。我似乎无法找出表结构的错误所在,而且我在网上也找不到任何有意义的东西。任何帮助都将不胜感激,谢谢。下面的代码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
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)
。(另外,如果将它们作为列定义的一部分内联编写,则可以让数据类型从父级继承。)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
。使用编号(11)。(另外,虽然integer(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
列