在过去的两天里,我一直在看这个代码,但我似乎无法让它发挥作用。它一直给我
ORA-00907: missing right parenthesis。
我知道这是一个经常出现的话题,但由于某种原因,我所看到的例子都没有对我有所帮助。有人能告诉我为什么会有这个错误吗?我很确定这和我的括号无关,也许是我的限制?
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. 发布于 2014-07-05 14:08:48
ORA-00907:缺少右括号
这是几条表示代码包含一个或多个语法错误的通用错误消息之一。有时,这可能意味着我们忽略了一个右括号;这很容易验证我们是否使用了一个具有匹配括号功能的编辑器(大多数针对编码器的文本编辑器是这样做的)。但这通常意味着编译器遇到了上下文之外的关键字。或者是一个拼错的单词,一个空格,而不是下划线或逗号缺失。
不幸的是,我们的代码不能编译的原因实际上是无限的,编译器只是不够聪明来区分它们。因此,它抛出了一个通用的,有点神秘的,像ORA-00907: missing right parenthesis的信息,并留给我们去发现真正的花朵。
发布的脚本有几个语法错误。首先,我将讨论触发ORA-0097的错误,但是您需要全部修复它们。
外键约束可以按照引用列声明,也可以在表级别声明所有列之后。它们有不同的语法;您的脚本将两者混合在一起,这就是您获得ORA-00907的原因。
内联声明没有逗号,也不包括引用列名。
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)表级约束是一个单独的组件,因此必须有一个逗号,并提到引用列。
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)以下是其他语法错误的列表:
HISTORYS_T表之前,不能为ORDERS创建外键。LIBRARY_T和FORMAT_T)中拼错了引用表的名称。DATE DEFAULT sysdate。以冷静的眼光看待我们自己的代码是我们作为开发人员要获得成功所需要的一项技能。熟悉Oracle的文档确实有帮助。对代码和SQL引用中的示例进行并行比较可以帮助您在不到两天的时间内解决这些语法错误。在这里找到它(11g)和这里(12c).
除了语法错误之外,您的脚本还包含设计错误。这些不是失败,而是不应该成为习惯的不良做法。
HISTORY_T有名为historys_T_FK和fk_order_id_orders的约束,这两个约束都没有帮助。一个有用的惯例是<child_table>_<parent_table>_fk。因此,history_customer_fk和history_order_fk分别。FORMATS之间创建循环外键。您可以通过在单独的语句中创建约束来做到这一点,但不要这样做:插入行时会出现问题,更糟糕的是删除时会出现问题。您应该重新考虑您的数据模型,并找到一种方法来建模两个表之间的关系,以便一个是父表,另一个是子表。或者您可能需要一种不同类型的关系,例如交叉表。LIBRARY_T的命名惯例是丑陋的。尝试找到一个更有表现力的名称,它不需要不必要的后缀来避免关键字冲突。T_CUSTOMERS甚至更加丑陋,既与其他表不一致,又完全没有必要,因为customers不是关键字。命名东西是很难的。你不会相信我这么多年来一直在争论桌子的名字。最重要的是一致性。如果我查看一个数据字典,并看到名为T_CUSTOMERS和LIBRARY_T的表,我的第一个反应将是混乱。为什么这些表以不同的约定命名?概念上的差异表示的是什么?所以,请,决定一个命名惯例,并坚持。使您的表名要么是单数,要么是所有复数。尽量避免前缀和后缀;我们已经知道它是一个表,我们不需要T_或_TAB。
发布于 2014-07-04 22:04:14
我建议将所有外键约束从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约束可能依赖于这些未能创建的表。
发布于 2014-07-04 21:19:06
尽管来自无用的_T和拼写错误的历史。如果使用SQL*Plus,则不接受在create table <name> (和列定义之间使用空新行的create语句。
https://stackoverflow.com/questions/24580780
复制相似问题