хотите связать назначение экипажа с приведенными выше таблицами, учитывая, что я получаю ошибку, Как решить эту ошибку?

#oracle #foreign-keys #ddl

Вопрос:

 CREATE TABLE Route(
RouteNo VARCHAR(10),
Origin VARCHAR(30),
Destination VARCHAR(30),
DepartureTime VARCHAR(15),
SerialNo VARCHAR(5),
ArrivalTime VARCHAR(15),
PRIMARY KEY(RouteNo) );

CREATE TABLE Employee(
EmployeeID VARCHAR(5) NOT NULL,
Name VARCHAR(30),
Phone NUMBER,
JobTitle VARCHAR(30),
PRIMARY KEY(EmployeeID) );



CREATE TABLE Flight(
SerialNo VARCHAR(5),
RouteNo VARCHAR(5),
FlightDate DATE,
ActualTD VARCHAR(10),
ActualTA VARCHAR(10),
PRIMARY KEY(SerialNo, RouteNo, FlightDate),
FOREIGN KEY(RouteNo) REFERENCES Route(RouteNo),
FOREIGN KEY(SerialNo) REFERENCES Airplane(SerialNo) ); -- does Airplane table exists ? 

CREATE TABLE CrewAssigment(
EmployeeID VARCHAR(5),
RouteNo VARCHAR(5),
FlightDate DATE,
Role VARCHAR(45),
Hours INT,
PRIMARY KEY(EmployeeID, RouteNo, FlightDate),
FOREIGN KEY(EmployeeID) REFERENCES Employee(EmployeeID),
FOREIGN KEY(RouteNo) REFERENCES Route(RouteNo),
FOREIGN KEY(FlightDate) REFERENCES Flight(FlightDate) );

Select * from CrewAssignment
 

Это мой код, в котором я получаю ошибку в таблице CrewAssignment, а выше приведены таблицы, из которых ссылается внешний ключ.

Отчет об ошибке — ORA-02270: нет совпадающего уникального или первичного ключа для этого списка столбцов 02270. 00000-«нет совпадающего уникального или первичного ключа для этого списка столбцов» *Причина: Предложение REFERENCES в инструкции CREATE/ALTER TABLE дает список столбцов, для которого в таблице, на которую ссылается, нет ограничения на совпадающий уникальный или первичный ключ. *Действие: Найдите правильные имена столбцов, используя представление каталога ALL_CONS_COLUMNS

Комментарии:

1. Одна вещь, отмеченная: RouteNo varchar(10) против RouteNo varchar(5) ?

Ответ №1:

Несколько возражений.

  • Это явно вопрос Оракула, а не MySQL. Откуда мне знать? ORA-02270 это код ошибки базы данных Oracle; обратите внимание на используемые вами теги.
  • Вы должны использовать VARCHAR2 тип данных вместо VARCHAR . Почему? Oracle рекомендует это сделать.
  • create table flight сначала происходит сбой, так как он ссылается на airplane таблицу, и она еще не существует (по крайней мере, не в коде, который вы опубликовали)
  • ошибка, на которую вы жалуетесь, вызвана create table crewassignment . Один из его внешних ключей ссылается на flight таблицу:
     FOREIGN KEY(flightdate) REFERENCES flight(flightdate)
     

    но flight первичный ключ является составным и состоит из 3 столбцов:

     PRIMARY KEY(serialno,
                routeno,
                flightdate)
     

    это означает, что вы не можете создать этот внешний ключ.

Итак, что же делать? Понятия не имею, я не знаю правил, ответственных за такую модель данных. Либо измените первичный ключ flight таблицы, либо измените ограничение внешнего ключа crewassingment таблицы.

Возможно, вы могли бы добавить новый столбец в flight таблицу (состоящий из последовательности (или столбца идентификаторов, если ваша версия базы данных поддерживает его), а затем позволить crewassignment таблице ссылаться на этот первичный ключ. Столбцы, которые вы в настоящее время используете в качестве первичного ключа ( serialno, routeno, flightdate ), затем переключатся на уникальный ключ.