use*_*509 6 sql oracle ora-00907
我过去两天一直在看这个代码,我似乎无法让它工作.它一直在给我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);
Run Code Online (Sandbox Code Playgroud)
以下是我运行代码时得到的结果:
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.
Run Code Online (Sandbox Code Playgroud)
APC*_*APC 17
以下是错误的完整列表:
ORA-00907: missing right parenthesisHISTORYS_T在创建引用的ORDERS表之前,无法创建外键.LIBRARY_T.FORMAT_T)中拼错了引用表的名称.DATE DEFAULT sysdate这些都是语法错误.如果您正确地查看Oracle的文档,那么您将浪费大约不到两天的时间. 在这里找到它.
除错误外,您的脚本还包含错误.
HISTORY_T和之间创建循环外键historys_T_FK.您可以通过在单独的语句中创建约束来执行此操作,但不要:插入行时会出现问题,甚至更糟的删除问题.您应该重新考虑您的数据模型,并找到一种方法来模拟两个表之间的关系,以便一个是父项,另一个是子项.或许您需要一种不同的关系,例如交叉表.fk_order_id_orders是丑陋的.尝试找到一个更具表现力的名称,不需要不必要的后缀来避免关键字冲突.<child_table>_<parent_table>_fk甚至更丑,既与其他表不一致又完全没有必要,因为history_customer_fk它不是关键字.我建议将所有外键约束从您的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);
Run Code Online (Sandbox Code Playgroud)
特别是,您的表formats和library表都彼此具有外键约束。CREATE TABLE创建这两个表的两个语句永远不会成功运行,因为每个语句只有在另一个表已经创建后才能运行。
分离约束创建允许您创建彼此具有 FK 约束的表。此外,如果您有一个约束错误,则只有该约束无法创建。目前,因为你的CREATE TABLE语句中的约束有错误,那么整个表创建失败,你会得到各种连锁错误,因为 FK 约束可能依赖于这些未能创建的表。