2016-09-14 15 views
0

外部キーでいくつかのエラーが発生しているため、データベースを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) 
); 

- のEG形式で外部キーバンチング:

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

私が手にエラーがある:

1005 - テーブルを作成できません '航空#のSQL-1d7_7c。'(errnoに: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); 

答えて

1

これは、それが外部キーをやってまで追加参照のためにそれをやって、最初Flights.fdateにインデックスを追加する最初の

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

試しに失敗したものですできます。それがあなたのために働くかどうか私に教えてください、それは私のためにしました。

ところで、そこであなたのスキルを再考したいと思うかもしれません。結合とリレーションシップは実際に整数でのみ行われるべきです。そのスキーマは成長するにつれ急速に低下するでしょう。また、これは個人的な好みであるかもしれませんが、私はfirst_nameからfNameまで好きです。

+0

私が気づいたことは、私がテーブルを複数回参照していた行のいずれかが失敗してしまったということです。他の開発者のために読みやすくなりました。これは1986年ではありません。 fNumが機能していることがわかった場合、最初のバージョンですが、フライトに参照されているものの残りの部分は動作しません。インデックスを追加するとどういう意味だったのですか、私はちょっと混乱しています。 名前を変更します。ありがとうございます! – sandalwood

+0

ALTER TABLE '航空会社'フライト 'ADD INDEX' fDate'( 'fDate')USING BTREE; – systematical

+0

ありがとう!すぐに修正しました。 – sandalwood