#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
), затем переключатся на уникальный ключ.