找不到主表的引用字段的唯一索引

时间:2014-11-12 02:48:19

标签: sql

当我运行预订表时,它会显示消息“找不到主表的引用字段的唯一索引”。

创建表客户

CREATE TABLE CUSTOMER
(
CUSTID               INTEGER NOT NULL,
FNAME             CHAR(18) NOT NULL,
LNAME            CHAR(18) NOT NULL,
STREET                CHAR(6) NOT NULL,
CITY                 CHAR(18) NOT NULL,
PROVINCE             CHAR(8) NOT NULL,
COUNTRY              CHAR(8) NOT NULL,
POSTCODE                CHAR(6) NOT NULL,
GENDER CHAR(6) NOT NULL,
PRIMARY KEY (CUSTID)
);

创建表格预订

CREATE TABLE BOOKING 
(
BKGNO               INTEGER NOT NULL,
CUSTID               INTEGER NOT NULL,
FNO                    INTEGER NOT NULL,   
STATUSID           CHAR(3) NOT NULL,
CLASSID             CHAR(4) NOT NULL,
ORIG                  CHAR(18) NOT NULL,
DEST                   CHAR(18),
DEPTTIME           DATE NOT NULL,
ARRTIME            DATE NOT NULL,
BKGCITY             CHAR(18) NOT NULL,
PAIDBY               CHAR(18) NOT NULL,
FPRICE               CURRENCY NOT NULL,
TOTPRICE           CURRENCY NOT NULL,
PAIDAMT            CURRENCY NOT NULL,
BAL                     CURRENCY NOT NULL,
BKGDATE            DATE NOT NULL,
PRIMARY KEY (BKGNO),
INDEX (ORIG,DEST,DEPTTIME, ARRTIME),
INDEX (CUSTID),
FOREIGN KEY (CUSTID) REFERENCES CUSTOMER,
FOREIGN KEY (FNO) REFERENCES FLIGHT_AVAILABILITY(FNO),
FOREIGN KEY(DEST) REFERENCES FLIGHT_AVAILABILITY(DEST),
FOREIGN KEY(DEPTTIME) REFERENCES FLIGHT_AVAILABILITY(DEPTTIME),
FOREIGN KEY(ARRTIME) REFERENCES FLIGHT_AVAILABILITY(ARRTIME),
FOREIGN KEY(DEST,DEPTTIME,ARRTIME) REFERENCES FLIGHT_AVAILABILITY(DEST, DEPTTIME, ARRTIME),
FOREIGN KEY (ORIG) REFERENCES AIRPORT(AIRPORTCD)
);

创建表格航班可用性

CREATE TABLE FLIGHT_AVAILABILITY 
(
FNO                  INTEGER NOT NULL,
ORIG               CHAR(18) NOT NULL,
DEST                CHAR(18),
DEPTTIME        DATE NOT NULL,
ARRTIME        DATE NOT NULL,
FLENGTH         INTEGER NOT NULL,
PRIMARY KEY (FNO,ORIG,DEST,DEPTTIME,ARRTIME)
);

创建TableAirport

CREATE TABLE AIRPORT 
(
AIRPORTCD        CHAR(18) NOT NULL,
CITYID                 CHAR(18) NOT NULL,
AIRPORTNM       CHAR(18) NOT NULL,
AIRPORTTAX       CURRENCY,       
PRIMARY KEY (AIRPORTCD)
);

1 个答案:

答案 0 :(得分:0)

这部分导致错误:

FOREIGN KEY (FNO) REFERENCES FLIGHT_AVAILABILITY(FNO),
FOREIGN KEY(DEST) REFERENCES FLIGHT_AVAILABILITY(DEST),
FOREIGN KEY(DEPTTIME) REFERENCES FLIGHT_AVAILABILITY(DEPTTIME),
FOREIGN KEY(ARRTIME) REFERENCES FLIGHT_AVAILABILITY(ARRTIME),
FOREIGN KEY(DEST,DEPTTIME,ARRTIME) REFERENCES FLIGHT_AVAILABILITY(DEST, DEPTTIME, ARRTIME)
  

外键约束(也称为引用完整性   约束)将列指定为外键并建立一个   该外键与指定的 或之间的关系   唯一键,称为引用键。复合外键   将列的组合指定为外键。

因此,引用的键应该是唯一键或主键。

例如:

FOREIGN KEY (FNO) REFERENCES FLIGHT_AVAILABILITY(FNO)

引用密钥= FNO,它不是唯一的,也不是主键。虽然FNO是复合PRIMARY KEY (FNO,ORIG,DEST,DEPTTIME,ARRTIME)的一部分,但它不是唯一的(主键的所有列的组合都是唯一的。)

P.S。你真的不需要在FLIGHT_AVAILABILITY表中的主键中有这么多列。您可以在这些列上创建复合唯一索引(如果它确实需要)并在每列上创建NOT NULL约束。在这种情况下,您将使用与当前复合主键相同的检查。但我认为你不需要这个。