php - MySQL外键问题

标签 php mysql

我在尝试将数据库加载到 MySQL 时遇到问题,因为我的外键出现一些错误。我尝试解决此问题的方法是: - 将外键放在主键之后 例如:

CREATE TABLE IF NOT EXISTS Passenger (
.......
PRIMARY KEY(tNum),
FOREIGN KEY (fNum) REFERENCES Flights(fNum),
FOREIGN KEY (fDate) REFERENCES Flights(fDate),
FOREIGN KEY (sCity) REFERENCES Flights(sCity),
FOREIGN KEY (eCity) REFERENCES Flights(eCity)
);

- 以以下格式捆绑外键 例如:

ALTER TABLE Passenger ADD FOREIGN KEY (fNum, fDate, sCity, eCity) REFERENCES Flights(fNum, fDate, sCity, eCity);

我得到的错误是:

1005 - 无法创建表“airline.#sql-1d7_7c”(错误号:150)

我的完整代码是:

DROP DATABASE IF EXISTS airline;
CREATE DATABASE IF NOT EXISTS airline;
USE airline;

CREATE TABLE IF NOT EXISTS Flights (
    fNum char(6) not null,
    pID char(4) not null,
    fDate DATE not null,
    eDate DATE  not null,
    sTime char(4) not null,
    lTime char(4) not null,
    sOStart char(4) null,
    sOEnd char(4) null,
    sCity varchar(30) not null,
    eCity varchar(30) not null,
    sOCity varchar(30),
    sNum char(5) not null,
    PRIMARY KEY (fNum)
);

CREATE TABLE IF NOT EXISTS Passenger (
    tNum char(4) not null,
    dPurch DATE not null,
    pMethod varchar(30) not null,
    fNum char(6) not null,
    fDate DATE not null,
    sCity varchar(30) not null,
    eCity varchar(30) not null,
    tType varchar(30) not null,
    Price decimal(4,2) not null,
    iType varchar(30) not null,
    idNum char(8) not null,
    fName varchar(30) not null,
    lName varchar(30) not null,
    Sex char(1) not null,
    pAddress varchar(30) not null,
    pPhone char(8) not null,
    pEmail varchar(30) not null,
    PRIMARY KEY(tNum)
);

CREATE TABLE IF NOT EXISTS Planes (
    pID char(4) not null,
    pType char(3) not null,
    pDesc varchar(30) not null,
    pRange char(4) not null,
    Capacity char(3) not null,
    mDate DATE not null,
    pDate DATE not null,
    sDate DATE not null,
    PRIMARY KEY (pID)
);

CREATE TABLE IF NOT EXISTS Staff (
    sNum char(5) not null,
    sName varchar(30) not null,
    sDOB DATE not null,
    sAddress varchar(30) not null,
    pCompany varchar(30) ,
    pStart DATE ,
    pEnd DATE ,
    jID char(1) not null,
    PRIMARY KEY (sNum)
);

CREATE TABLE IF NOT EXISTS Emergency (
    eID char(5) not null,
    sNum char(5) not null,
    eName varchar(30) not null,
    eAddress varchar(30) not null,
    ePhone char(8) not null,
    eEmail varchar(30) not null,
    eRelationship varchar(30) not null, 
    PRIMARY KEY(eID)
);

CREATE TABLE IF NOT EXISTS Pilot (
    sNum char(5) not null,
    pID char(4) not null,
    cDate DATE not null,
    jID char(1) not null,
    PRIMARY KEY(jID)
);

CREATE TABLE IF NOT EXISTS Attendant (
    sNum char(5) not null,
    tSDate Date not null,
    tFDate Date not null,
    tDesc Varchar(30) not null,
    jID Char(1) not null,
    PRIMARY KEY(jID)
);

ALTER TABLE Flights ADD FOREIGN KEY (pID) REFERENCES Planes(pID);
ALTER TABLE Flights ADD FOREIGN KEY (sNum) REFERENCES Staff(sNum);

ALTER TABLE Passenger ADD FOREIGN KEY (fNum) REFERENCES Flights(fNum);
ALTER TABLE Passenger ADD FOREIGN KEY (fDate) REFERENCES Flights(fDate);
ALTER TABLE Passenger ADD FOREIGN KEY (sCity) REFERENCES Flights(sCity);
ALTER TABLE Passenger ADD FOREIGN KEY (eCity) REFERENCES Flights(eCity);

ALTER TABLE Emergency ADD FOREIGN KEY (sNum) REFERENCES Staff(sNum);

ALTER TABLE Pilot ADD FOREIGN KEY (sNum) REFERENCES Staff(sNum);
ALTER TABLE Pilot ADD FOREIGN KEY (pID) REFERENCES Planes(pID);
ALTER TABLE Pilot ADD FOREIGN KEY (jID) REFERENCES Staff(jID);

ALTER TABLE Attendant ADD FOREIGN KEY (sNum) REFERENCES Staff(sNum);
ALTER TABLE Attendant ADD FOREIGN KEY (jID) REFERENCES Staff(jID);

最佳答案

对我来说,这是第一次失败

ALTER TABLE Passenger ADD FOREIGN KEY (fDate) REFERENCES Flights(fDate);

首先尝试在 Flights.fdate 上添加索引,然后执行外键并为其他引用执行此操作,直到它起作用为止。让我知道这是否对你有用,它对我有用。

顺便说一句,您可能想重新考虑您的架构。连接和关系实际上应该只在整数上完成。随着该模式的增长,它会很快陷入困境。另外,也许这只是个人喜好,但我更喜欢名字而不是 fName。对于其他开发人员来说更容易阅读,这不是 1986 年,我们现在可以拥有人类可读的名称:-)

关于php - MySQL外键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39482067/

相关文章:

php - mysqli_query "where = $some_array"只需要一个匹配项

javascript - 将多行从 HTML 发送到 PHP 并存储在 JSON 中

php - 通过一次查询更新大型数据库

php - 使用 JQuery ajax.Post() 更新数据库

c# - 实体之间的一对一关系不适用于 Entity Framework 6

mysql - MYSQL合并两列

php - 使用 Curl、PHP 和 HTML 显示 Google 图像 - Wordpress

php - 如何在 yii 框架的命令类中修复 CConsoleApplication.user 未定义?

php - 根据字段对记录进行优先级排序的逻辑

php - Mysql Group BY 查询索引