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 ответа
Вот полный список ошибок:
- Ограничения внешнего ключа требуют, чтобы мы назначили ссылочный столбец (столбцы) в дочерней таблице, а также ссылочный столбец (столбцы) в родительской таблице. Поэтому объявления внешнего ключа должны выглядеть следующим образом:
CONSTRAINT fk_order_id_orders FOREIGN KEY (order_id) REFERENCES orders (order_id) ON DELETE CASCADE
- Ссылочная таблица (и ссылочный первичный ключ или ограничение уникальности) уже должны существовать, прежде чем мы сможем создать для них внешний ключ. Таким образом, вы не можете создать внешний ключ для
HISTORYS_T
до того, как вы создали ссылкуORDERS
Таблица. - Порядок компонентов не является произвольным. Мы должны объявить все столбцы, прежде чем объявить ограничения на уровне таблицы. Это влияет как на ЗАКАЗЫ, так и на
HISTORYS_T
, - Вы ошиблись в именах ссылочных таблиц в некоторых пунктах внешнего ключа (
LIBRARY_T and FORMAT_T
). - Вы должны предоставить выражение в предложении DEFAULT. Для столбцов DATE, которые обычно являются текущей датой,
DATE DEFAULT sysdate.
Это все синтаксические ошибки. Вы бы потратили на это значительно меньше двух дней, если бы правильно посмотрели документацию Oracle. Найдите это здесь.
Как и ошибки, ваши скрипты содержат ошибки.
- Вы не назвали большинство своих ограничений. Oracle даст им имя по умолчанию, но оно будет ужасным и затруднит понимание словаря данных. Мы всегда должны явно указывать каждое ограничение.
- Полезно создавать ограничения с помощью отдельных операторов. Создание таблиц, затем первичных ключей, а затем внешних ключей позволит избежать проблем с упорядочением зависимостей, указанных выше.
- Вы пытаетесь создать циклические внешние ключи между
LIBRARY_T
а такжеFORMATS
, Вы можете сделать это, создав ограничения в отдельном выражении, но не сделайте этого: у вас будут проблемы при вставке строк и еще хуже проблемы с удалениями. Вам следует пересмотреть свою модель данных и найти способ смоделировать отношения между двумя таблицами, чтобы одна была родительской, а другая дочерней. Или, возможно, вам нужен другой тип отношений, например, таблица пересечений. - Соглашение об именах
LIBRARY_T
некрасиво Попробуйте найти более выразительное имя, которое не требует ненужного суффикса, чтобы избежать столкновения ключевых слов. 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 никогда не очень хорошо описывал причину ошибок - в качестве примера можно привести "Таблицы мутаций".
Дайте мне знать, если вам не хватает дополнительных проблем.