ORA-00907:缺少右括号

时间:2014-07-04 21:12:14

标签: 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);

以下是我运行代码时得到的结果:

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.               

4 个答案:

答案 0 :(得分:14)

以下是错误的完整列表:

  1. 外键约束要求我们指定子表上的引用列以及父表上引用的列。因此外键声明应如下所示:CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders (order_id) ON DELETE CASCADE
  2. 在我们可以为它们创建外键之前,引用的表(以及引用的主键或唯一约束)必须已经存在。因此,在创建引用的HISTORYS_T表之前,无法为ORDERS创建外键。
  3. 组件的顺序不是任意的。在声明表级约束之前,我们必须声明所有列。这会影响ORDERS和HISTORYS_T
  4. 您在某些外键子句(LIBRARY_T and FORMAT_T)中拼错了引用表的名称。
  5. 您需要在DEFAULT子句中提供表达式。对于通常为当前日期的DATE列DATE DEFAULT sysdate.
  6. 这些都是语法错误。如果您正确地查看Oracle的文档,那么您将浪费大约不到两天的时间。 Find it here

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

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

特别是,您的formatslibrary表都有外键约束。创建这两个表的两个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;就是一个很好的例子。

如果您遗失了其他问题,请告诉我。