首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00907:缺少右括号

ORA-00907:缺少右括号
EN

Stack Overflow用户
提问于 2014-07-04 21:12:14
回答 4查看 343.4K关注 0票数 22

在过去的两天里,我一直在看这个代码,但我似乎无法让它发挥作用。它一直给我

ORA-00907: missing right parenthesis

我知道这是一个经常出现的话题,但由于某种原因,我所看到的例子都没有对我有所帮助。有人能告诉我为什么会有这个错误吗?我很确定这和我的括号无关,也许是我的限制?

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
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.               
EN

回答 4

Stack Overflow用户

发布于 2014-07-05 14:08:48

ORA-00907:缺少右括号

这是几条表示代码包含一个或多个语法错误的通用错误消息之一。有时,这可能意味着我们忽略了一个右括号;这很容易验证我们是否使用了一个具有匹配括号功能的编辑器(大多数针对编码器的文本编辑器是这样做的)。但这通常意味着编译器遇到了上下文之外的关键字。或者是一个拼错的单词,一个空格,而不是下划线或逗号缺失。

不幸的是,我们的代码不能编译的原因实际上是无限的,编译器只是不够聪明来区分它们。因此,它抛出了一个通用的,有点神秘的,像ORA-00907: missing right parenthesis的信息,并留给我们去发现真正的花朵。

发布的脚本有几个语法错误。首先,我将讨论触发ORA-0097的错误,但是您需要全部修复它们。

外键约束可以按照引用列声明,也可以在表级别声明所有列之后。它们有不同的语法;您的脚本将两者混合在一起,这就是您获得ORA-00907的原因。

内联声明没有逗号,也不包括引用列名。

代码语言:javascript
复制
CREATE TABLE historys_T    (
    history_record    VARCHAR2 (8),
    customer_id       VARCHAR2 (8) 
          CONSTRAINT historys_T_FK FOREIGN KEY REFERENCES T_customers ON DELETE CASCADE,
    order_id           VARCHAR2 (10) NOT NULL,
          CONSTRAINT fk_order_id_orders REFERENCES orders ON DELETE CASCADE)

表级约束是一个单独的组件,因此必须有一个逗号,并提到引用列。

代码语言:javascript
复制
CREATE TABLE historys_T    (
    history_record    VARCHAR2 (8),
    customer_id       VARCHAR2 (8),    
    order_id           VARCHAR2 (10) NOT NULL,
    CONSTRAINT historys_T_FK FOREIGN KEY (customer_id) REFERENCES T_customers ON DELETE CASCADE,   
   CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders ON DELETE CASCADE)

以下是其他语法错误的列表:

  1. 引用的表(以及引用的主键或唯一约束)必须已经存在,然后才能针对它们创建外键。因此,在创建引用的HISTORYS_T表之前,不能为ORDERS创建外键。
  2. 您在一些外键子句(LIBRARY_TFORMAT_T)中拼错了引用表的名称。
  3. 您需要在默认子句中提供一个表达式。对于通常为当前日期的日期列,DATE DEFAULT sysdate

以冷静的眼光看待我们自己的代码是我们作为开发人员要获得成功所需要的一项技能。熟悉Oracle的文档确实有帮助。对代码和SQL引用中的示例进行并行比较可以帮助您在不到两天的时间内解决这些语法错误。在这里找到它(11g)这里(12c).

除了语法错误之外,您的脚本还包含设计错误。这些不是失败,而是不应该成为习惯的不良做法。

  1. 您还没有指定大部分约束。Oracle将给他们一个默认的名称,但这将是一个可怕的名称,并使数据字典更难理解。显式命名每个约束有助于我们导航物理数据库。当我们的SQL触发一个约束冲突时,它还会导致更容易理解的错误消息。
  2. 始终如一地命名您的约束。HISTORY_T有名为historys_T_FKfk_order_id_orders的约束,这两个约束都没有帮助。一个有用的惯例是<child_table>_<parent_table>_fk。因此,history_customer_fkhistory_order_fk分别。
  3. 使用单独的语句创建约束可能是有用的。创建表然后是主键然后是外键将避免上述依赖排序的问题。
  4. 您正在尝试在FORMATS之间创建循环外键。您可以通过在单独的语句中创建约束来做到这一点,但不要这样做:插入行时会出现问题,更糟糕的是删除时会出现问题。您应该重新考虑您的数据模型,并找到一种方法来建模两个表之间的关系,以便一个是父表,另一个是子表。或者您可能需要一种不同类型的关系,例如交叉表。
  5. 避免脚本中的空行。有些工具会处理这些问题,但有些则不会。我们可以再加上处理它们,但最好避免这种需要。
  6. LIBRARY_T的命名惯例是丑陋的。尝试找到一个更有表现力的名称,它不需要不必要的后缀来避免关键字冲突。
  7. T_CUSTOMERS甚至更加丑陋,既与其他表不一致,又完全没有必要,因为customers不是关键字。

命名东西是很难的。你不会相信我这么多年来一直在争论桌子的名字。最重要的是一致性。如果我查看一个数据字典,并看到名为T_CUSTOMERSLIBRARY_T的表,我的第一个反应将是混乱。为什么这些表以不同的约定命名?概念上的差异表示的是什么?所以,请,决定一个命名惯例,并坚持。使您的表名要么是单数,要么是所有复数。尽量避免前缀和后缀;我们已经知道它是一个表,我们不需要T__TAB

票数 33
EN

Stack Overflow用户

发布于 2014-07-04 22:04:14

我建议将所有外键约束从CREATE TABLE语句中分离出来。首先在没有FK约束的情况下创建所有表,然后在创建表后创建所有FK约束。

可以使用SQL将FK约束添加到表中,如下所示:

代码语言:javascript
复制
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约束可能依赖于这些未能创建的表。

票数 5
EN

Stack Overflow用户

发布于 2014-07-04 21:19:06

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24580780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档