我过去两天一直在看这个代码,我似乎无法让它工作。它一直给我ORA-00907: missing right parenthesis
。我知道这是一个很多问题,但由于某些原因,我见过的所有例子都没有帮助我。有人可以告诉我为什么我得到这个错误,我该如何解决它。我很确定它与我的括号无关,也许是我的CONSTRAINTS
DROP TABLE T_customers CASCADE CONSTRAINTS;
DROP TABLE dvd_collection CASCADE CONSTRAINTS;
DROP TABLE vhs_collection CASCADE CONSTRAINTS;
CREATE TABLE T_customers (
customer_id VARCHAR2 (8) PRIMARY KEY,
last_name VARCHAR2 (30) NOT NULL,
first_name VARCHAR2 (20) NOT NULL,
street VARCHAR2 (30) NOT NULL,
city VARCHAR2 (30) NOT NULL,
state CHAR (2) NOT NULL,
CHECK (state IN ('GA','DC','VA','NY')),
zip_code CHAR (5)
CHECK (TO_NUMBER(zip_code)
BETWEEN 10000 AND 27999),
home_phone VARCHAR2 (12) UNIQUE,
work_phone VARCHAR2 (12) UNIQUE,
email VARCHAR2 (95) NOT NULL);
CREATE TABLE historys_T (
history_record VARCHAR2 (8),
customer_id VARCHAR2 (8),
CONSTRAINT historys_T_FK FOREIGN KEY (customer_id) REFERENCES T_customer
ON DELETE CASCADE,
order_id VARCHAR2 (10) NOT NULL,
CONSTRAINT fk_order_id_orders
REFERENCES orders
ON DELETE CASCADE);
CREATE TABLE orders (
order_id VARCHAR2 (10) PRIMARY KEY,
m_p_unique_id VARCHAR2 (10),
CONSTRAINT orders_FK FOREIGN KEY (m_p_unique_id) REFERENCES library (m_p_unique_id)
order_date DATE DEFAULT);
CREATE TABLE library_T (
m_p_unique_id VARCHAR2 (10) PRIMARY KEY,
movie_title VARCHAR2 (80) NOT NULL,
serial_number VARCHAR2 (10) NOT NULL,
movie_id_number VARCHAR2 (10) NOT NULL,
movie_cast VARCHAR2 (100) NOT NULL,
movie_format CHAR (3) NOT NULL,
CONSTRAINT library_FK REFERENCES formats (movie_format));
CREATE TABLE formats_T (
movie_format CHAR (3) PRIMARY KEY,
movie_title VARCHAR2 (80) NOT NULL,
m_p_unique_id VARCHAR2 (10) NOT NULL,
CONSTRAINT format_FK REFERENCES library (m_p_unique_id));
CREATE TABLE dvd_collection (
m_p_unique_id VARCHAR2 (10) NOT NULL,
serial_number VARCHAR2 (10) NOT NULL,
movie_id_number VARCHAR2 (10) NOT NULL,
movie_title VARCHAR2 (80) NOT NULL,
movie_cast VARCHAR2 (100) NOT NULL,
movie_format VARCHAR2 (80) NOT NULL,
movie_rating VARCHAR2 (6) NOT NULL,
movie_distributer VARCHAR2 (30) NOT NULL,
movie_price NUMBER (3,2) NOT NULL,
movie_length NUMBER (3) NOT NULL,
movie_award VARCHAR2 (175) NOT NULL,
movie_release DATE);
CREATE TABLE vhs_collection
(
m_p_unique_id VARCHAR2 (10)NOT NULL,
serial_number VARCHAR2 (10) NOT NULL,
movie_id_number VARCHAR2 (10) NOT NULL,
movie_title VARCHAR2 (80) NOT NULL,
movie_cast VARCHAR2 (100) NOT NULL,
movie_format VARCHAR2 (80) NOT NULL,
movie_rating VARCHAR2 (6) NOT NULL,
movie_distributer VARCHAR2 (30) NOT NULL,
movie_price NUMBER (3,2) NOT NULL,
movie_length NUMBER (3) NOT NULL,
movie_award VARCHAR2 (175) NOT NULL,
movie_release DATE);
以下是我运行代码时得到的结果:
Table dropped.
Table dropped.
Table dropped.
Table created.
ON DELETE CASCADE)
*
ERROR at line 10:
ORA-00907: missing right parenthesis
order_date DATE DEFAULT)
*
ERROR at line 6:
ORA-00907: missing right parenthesis
CONSTRAINT library_FK REFERENCES formats (movie_format))
*
ERROR at line 9:
ORA-00907: missing right parenthesis
CONSTRAINT format_FK REFERENCES library (m_p_unique_id))
*
ERROR at line 6:
ORA-00907: missing right parenthesis
Table created.
Table created.
答案 0 :(得分:14)
以下是错误的完整列表:
CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders (order_id) ON DELETE CASCADE
HISTORYS_T
表之前,无法为ORDERS
创建外键。HISTORYS_T
。LIBRARY_T and FORMAT_T
)中拼错了引用表的名称。 DATE DEFAULT sysdate.
这些都是语法错误。如果您正确地查看Oracle的文档,那么您将浪费大约不到两天的时间。 Find it here
除错误外,您的脚本还包含错误。
LIBRARY_T
和FORMATS
之间创建循环外键。您可以通过在单独的语句中创建约束来完成此操作,但不要:插入行时会出现问题,甚至更糟的删除问题。您应该重新考虑您的数据模型,并找到一种方法来模拟两个表之间的关系,以便一个是父,另一个是子。或许您需要一种不同的关系,例如交叉表。LIBRARY_T
的命名惯例很难看。尝试找到一个更具表现力的名称,它不需要一个不必要的后缀来避免关键字冲突。T_CUSTOMERS
甚至更加丑陋,因为customers
不是关键字,因此与其他表格不一致且完全没有必要。答案 1 :(得分:3)
我建议从CREATE TABLE
语句中分离出所有外键约束。首先创建所有表而不使用FK约束,然后在创建表后创建所有FK约束。
您可以使用SQL将FK约束添加到表中,如下所示:
ALTER TABLE orders ADD CONSTRAINT orders_FK
FOREIGN KEY (m_p_unique_id) REFERENCES library (m_p_unique_id);
特别是,您的formats
和library
表都有外键约束。创建这两个表的两个CREATE TABLE
语句永远不能成功运行,因为每个表只有在已经创建了另一个表时才能运行。
分离出约束创建允许您创建彼此具有FK约束的表。此外,如果您有约束错误,则只能创建该约束。目前,由于您的CREATE TABLE
语句中的约束存在错误,因此整个表创建失败并且您会遇到各种连锁错误,因为FK约束可能取决于这些无法创建的表。
答案 2 :(得分:0)
虽然是无用的_T
和拼写错误的历史。如果您使用的是SQL*Plus
,则它不接受在create table <name> (
和列定义之间添加空行的create table语句。
答案 3 :(得分:0)
首先,在histories_T中,您正在引用表T_customer(应该是T_customers);其次,您缺少REFERENCES命令的FOREIGN KEY子句;没有使用您提供的代码创建(或删除)。
也可能存在其他错误,我承认Oracle从未如此擅长描述错误原因 - &#34;变异表&#34;就是一个很好的例子。
如果您遗失了其他问题,请告诉我。