2012-06-05 75 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, 

对于该主键,其不存在(因为在该表中的主键是(FLIGHTID,flightdate))的PostgreSQL检查。

引用飞行表时,那么掉落REFERENCES条款,并添加

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

在您在其他一些表定义的有方式。

+0

从技术上讲,列不需要是PK,适当的唯一约束就足够了:[“外键必须引用既可以是主键也可以构成唯一约束的列]”(http:// www。 postgresql.org/docs/current/static/ddl-constraints.html#DDL-CONSTRAINTS-FK) –