2012-06-05 4 views
1

Я имею эти две ошибки:PostgreSQL проблемы ограничений

ОШИБКА: нет ограничения уникальности, соответствующие заданным ключи для указанной таблицы «полет»

*** Ошибка ** *

ОШИБКА: нет уникального соответствия ограничений заданным ключам для таблицы «полет»

Это мой код:

CREATE TABLE Staff (
EmployeeNumber int NOT NULL, 
FirstName char(15) NOT NULL, 
LastName char(15) NOT NULL, 
SocialSecurity int NOT NULL, 
Sex char(1) NOT NULL, 
Address char(20) NOT NULL, 
City char(20) NOT NULL, 
Province char(15) NOT NULL, 
Country char(20) NOT NULL, 
Primary Key (EmployeeNumber) 
); 

CREATE TABLE FlightAttendent (
FALN int, 
StaffRole char (20) NOT NULL, 
EmployeeNumber int NOT NULL, 
Foreign Key (EmployeeNumber) References Staff(EmployeeNumber), 
Primary Key (FALN) 
); 

Create TABLE AircraftType (
ACType char (10), 
Instrument char(1) NOT NULL, 
Engines int NOT NULL, 
CrewCount int NOT NULL, 
PassengerCount int NOT NULL, 
Primary Key (ACType) 
); 


CREATE TABLE Pilot (
PILN int, 
MedicalValid date NOT NULL, 
StaffRole char (20) NOT NULL, 
EmployeeNumber int NOT NULL, 
AircraftType char (10) NOT NULL, 
Foreign Key (EmployeeNumber) references Staff(EmployeeNumber), 
Foreign Key (AircraftType) References AircraftType(ACType), 
Primary Key (PILN) 
); 

Create TABLE Aircraft (
AircraftID char(6) NOT NULL, 
AircraftManufacturer char(10) NOT NULL, 
AircraftType char(10) NOT NULL, 
Foreign Key (AircraftType) References AircraftType(ACType), 
Primary Key (AircraftID) 
); 

CREATE Table Airport (
AirportCode char(4) NOT NULL, 
AirportName char(40) NOT NULL, 
City char(20) NOT NULL, 
Country char(20) NOT NULL, 
Continent char(20) NOT NULL, 
Primary Key (AirportCode) 
); 

Create TABLE Flight (
FlightID char (20), 
FlightDate date, 
AircraftID char(6) NOT NULL, 
ArrivalAirport char(4) NOT NULL, 
DepartureAirport char(4) NOT NULL, 
PRIMARY KEY (FlightID, FlightDate), 
FOREIGN Key (ArrivalAirport) references Airport(AirportCode), 
FOREIGN Key (DepartureAirport) references Airport(AirportCode), 
FOREIGN KEY (AircraftID) references Aircraft(AircraftID) 
); 


Create TABLE FlightCrew (
FlightID char (20) REFERENCES Flight(FlightID) ON DELETE CASCADE, 
FlightDate date REFERENCES Flight(FlightDate) ON DELETE CASCADE, 
EmployeeNumber int NOT NULL, 
StaffRole char(20) NOT NULL, 
PRIMARY KEY(FlightID, FlightDate), 
Foreign Key (EmployeeNumber) references Staff(EmployeeNumber) 
); 

CREATE Table Passenger (
PassengerNumber int, 
PassportNumber int NOT NULL, 
Citizenship char (20) NOT NULL, 
FirstName char (20) NOT NULL, 
LastName char (20) NOT NULL, 
Primary Key (PassengerNumber) 
); 

CREATE Table PassengerManifest (
FlightID char(20), 
FlightDate date, 
PassengerNumber int NOT NULL, 
Foreign Key (FlightDate) References Flight(FlightDate), 
Foreign Key (PassengerNumber) References Passenger(PassengerNumber), 
Primary Key (FlightID, FlightDate) 
); 

Что я сделал не так? Благодаря!

ответ

5

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

В основном, когда вы говорите

FlightID char (20) REFERENCES Flight(FlightID) ON DELETE CASCADE, 

PostgreSQL проверяет, что первичный ключ, который не существует (так как первичный ключ этой таблицы (flightid, flightdate)).

Так падение REFERENCES положения при ссылке на таблицу полетов, а также добавить

FOREIGN KEY (FlightID, FlightDate) REFERENCES Flight (FlightID, FlightDate) 

Способом вы имеете в некоторых других определений таблицы.

+0

Технически столбцы не обязательно должны быть PK, достаточно подходящего уникального ограничения: [«внешний ключ должен ссылаться на столбцы, которые являются либо первичным ключом, либо образуют уникальное ограничение»] (http: // www. postgresql.org/docs/current/static/ddl-constraints.html#DDL-CONSTRAINTS-FK) –

Смежные вопросы