Проблема ограничения внешнего ключа в Oracle - PullRequest
3 голосов
/ 03 ноября 2011

Проблемы с объявлением FK в Oracle 9i. Я рассмотрел несколько примеров здесь, в SO и в некоторых онлайн-документах (например, http://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php) без особой удачи; попытка использовать синтаксис, аналогичный приведенному в ссылке, приводит к той же ошибке:

Error at Command Line:19 Column:4
Error report:
SQL Error: ORA-02253: constraint specification not allowed here
02253. 00000 -  "constraint specification not allowed here"
*Cause:    Constraint specification is not allowed here in the statement.
*Action:   Remove the constraint specification from the statement.

Выдержка из самого SQL приведена ниже. «Строка 19» относится к строке, начинающейся с CONSTRAINT

CREATE TABLE Flight (
flight_no varchar2(10) NOT NULL,
airplane_id varchar2(20) NOT NULL
    CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id)
    ON UPDATE RESTRICT ON DELETE RESTRICT,
dept_date date NOT NULL,
...

В качестве альтернативы, попытка без ключевого слова CONSTRAINT приводит к ошибке о правильной круглой скобке, которая, как я не вижу, отсутствует.

PS: Я понимаю, что ОГРАНИЧЕНИЕ ОБНОВЛЕНИЯ - это поведение по умолчанию в Oracle, но я предпочитаю быть по возможности явным.

Ответы [ 2 ]

5 голосов
/ 03 ноября 2011

Во-первых, в Oracle нет опции ON UPDATE RESTRICT или ON DELETE RESTRICT. Похоже, что они действительны в других механизмах баз данных, но их нет на диаграмме синтаксиса ограничения и они не являются действительными. Есть предложение ON DELETE, но единственными двумя допустимыми параметрами являются CASCADE или SET NULL. Нет ON UPDATE предложения.

Если мы добавим запятую в конце определения airplane_id перед определением константы и удалим два недействительных предложения, ваш DDL должен быть действительным

CREATE TABLE Flight (
  flight_no varchar2(10) NOT NULL,
  airplane_id varchar2(20) NOT NULL,
  CONSTRAINT flight_airplane_id_fk 
    FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id),
  dept_date date NOT NULL,
  <<more columns>>
);
0 голосов
/ 03 ноября 2011

Поставьте ограничение в конце:

CREATE TABLE Flight (
    flight_no varchar2(10) NOT NULL,
    airplane_id varchar2(20) NOT NULL,
    dept_date date NOT NULL,
    CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) REFERENCES Airplane  (airplane_id) ON UPDATE RESTRICT ON DELETE RESTRICT
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...