ORA-00907:缺少右括号

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

以下是错误的完整列表:

  1. 外键约束要求我们指定子表上的引用列以及父表上引用的列.所以外键声明应如下所示:ORA-00907: missing right parenthesis
  2. 在我们可以为它们创建外键之前,引用的表(以及引用的主键或唯一约束)必须已经存在.因此,HISTORYS_T在创建引用的ORDERS表之前,无法创建外键.
  3. 组件的顺序不是任意的.在声明表级约束之前,我们必须声明所有列.这会影响ORDERS和LIBRARY_T.
  4. 您在一些外键子句(FORMAT_T)中拼错了引用表的名称.
  5. 您需要在DEFAULT子句中提供表达式.对于通常是当前日期的DATE列,DATE DEFAULT sysdate

这些都是语法错误.如果您正确地查看Oracle的文档,那么您将浪费大约不到两天的时间. 在这里找到它.

除错误外,您的脚本还包含错误.

  1. 您尚未命名大多数约束.Oracle将为他们提供一个默认名称,但它将是一个可怕的名称,并使数据字典更难理解.我们应该始终明确命名每个约束.
  2. 使用单独的语句创建约束很有用.创建表然后主键然后外键将避免上面确定的依赖性排序的问题.
  3. 您正在尝试在HISTORY_T和之间创建循环外键historys_T_FK.您可以通过在单独的语句中创建约束来执行此操作,但不要:插入行时会出现问题,甚至更糟的删除问题.您应该重新考虑您的数据模型,并找到一种方法来模拟两个表之间的关系,以便一个是父项,另一个是子项.或许您需要一种不同的关系,例如交叉表.
  4. 命名惯例fk_order_id_orders是丑陋的.尝试找到一个更具表现力的名称,不需要不必要的后缀来避免关键字冲突.
  5. <child_table>_<parent_table>_fk甚至更丑,既与其他表不一致又完全没有必要,因为history_customer_fk它不是关键字.

  • 我知道已经有一段时间了,但我今天发现这个正在寻找语法帮助,这个彻底的答案令人惊叹。 (3认同)

Luk*_*ard 5

我建议将所有外键约束从您的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)

特别是,您的表formatslibrary表都彼此具有外键约束。CREATE TABLE创建这两个表的两个语句永远不会成功运行,因为每个语句只有在另一个表已经创建后才能运行。

分离约束创建允许您创建彼此具有 FK 约束的表。此外,如果您有一个约束错误,则只有该约束无法创建。目前,因为你的CREATE TABLE语句中的约束有错误,那么整个表创建失败,你会得到各种连锁错误,因为 FK 约束可能依赖于这些未能创建的表。


Mic*_*l-O 0

尽管来自无用_T且拼写错误的历史。如果您使用SQL*Plus,它不接受在create table <name> (和 列定义之间带有空新行的创建表语句。