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 ответа

Вот полный список ошибок:

  1. Ограничения внешнего ключа требуют, чтобы мы назначили ссылочный столбец (столбцы) в дочерней таблице, а также ссылочный столбец (столбцы) в родительской таблице. Поэтому объявления внешнего ключа должны выглядеть следующим образом: CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders (order_id) ON DELETE CASCADE
  2. Ссылочная таблица (и ссылочный первичный ключ или ограничение уникальности) уже должны существовать, прежде чем мы сможем создать для них внешний ключ. Таким образом, вы не можете создать внешний ключ для HISTORYS_T до того, как вы создали ссылку ORDERS Таблица.
  3. Порядок компонентов не является произвольным. Мы должны объявить все столбцы, прежде чем объявить ограничения на уровне таблицы. Это влияет как на ЗАКАЗЫ, так и на HISTORYS_T,
  4. Вы ошиблись в именах ссылочных таблиц в некоторых пунктах внешнего ключа (LIBRARY_T and FORMAT_T).
  5. Вы должны предоставить выражение в предложении DEFAULT. Для столбцов DATE, которые обычно являются текущей датой, DATE DEFAULT sysdate.

Это все синтаксические ошибки. Вы бы потратили на это значительно меньше двух дней, если бы правильно посмотрели документацию Oracle. Найдите это здесь.

Как и ошибки, ваши скрипты содержат ошибки.

  1. Вы не назвали большинство своих ограничений. Oracle даст им имя по умолчанию, но оно будет ужасным и затруднит понимание словаря данных. Мы всегда должны явно указывать каждое ограничение.
  2. Полезно создавать ограничения с помощью отдельных операторов. Создание таблиц, затем первичных ключей, а затем внешних ключей позволит избежать проблем с упорядочением зависимостей, указанных выше.
  3. Вы пытаетесь создать циклические внешние ключи между LIBRARY_T а также FORMATS, Вы можете сделать это, создав ограничения в отдельном выражении, но не сделайте этого: у вас будут проблемы при вставке строк и еще хуже проблемы с удалениями. Вам следует пересмотреть свою модель данных и найти способ смоделировать отношения между двумя таблицами, чтобы одна была родительской, а другая дочерней. Или, возможно, вам нужен другой тип отношений, например, таблица пересечений.
  4. Соглашение об именах LIBRARY_T некрасиво Попробуйте найти более выразительное имя, которое не требует ненужного суффикса, чтобы избежать столкновения ключевых слов.
  5. T_CUSTOMERS еще страшнее, будучи несовместимым с другими вашими таблицами и совершенно ненужным, так как customers это не ключевое слово.

Я бы порекомендовал отделить все ограничения внешнего ключа от вашего CREATE TABLE заявления. Сначала создайте все таблицы без ограничений FK, а затем создайте все ограничения FK после создания таблиц.

Вы можете добавить ограничение FK в таблицу, используя SQL, как показано ниже:

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 могут зависеть от этих таблиц, которые не удалось создать.

Хотя из бесполезного _T и неправильно написанные истории. Если вы используете SQL*Plus, он не принимает операторы создания таблицы с пустыми новыми строками между create table <name> ( и определения столбцов.

Во-первых, в историях_T вы ссылаетесь на таблицу T_customer (должно быть T_customers), а во-вторых, вы упускаете предложение FOREIGN KEY, которое указывает REFERENCES; который не создается (или удаляется) с предоставленным вами кодом.

Могут быть и дополнительные ошибки, и я признаю, что Oracle никогда не очень хорошо описывал причину ошибок - в качестве примера можно привести "Таблицы мутаций".

Дайте мне знать, если вам не хватает дополнительных проблем.

Другие вопросы по тегам