2016-09-18 6 views
0

私はSQLの航空会社の予約システムを設計していると私は二つの質問だ:外部キーが意図したとおりに動作しない

1.をこれを使用すると、2つの主キーを持っており、彼らは複合キー(とブリッジテーブルを作成するための適切な方法です両方の外部キーは他のテーブルを参照しています)?

CREATE TABLE FlightAndWeekday 
(
WeekID int(1) NOT NULL, 
FlightID varchar(5) NOT NULL, 
PRIMARY KEY (WeekID, FlightID), 
CONSTRAINT fk_FAW_WeekId FOREIGN KEY (WeekID) REFERENCES `Weekday`(`WeekID`), 
CONSTRAINT fk_FAW_FlightID FOREIGN KEY (FlightID) REFERENCES `Flight`(`FlightID`) 
); 

私は、コードのブロックを実行すると、正常に動作しますが、私はShow create table FlightAndWeekdayを書くとき外部キーが表示されていません。さらに、他のテーブルに存在しないレコードをテーブルに追加することができます。これは私を次の質問に導きます。

2.参照する列に存在しない外部キー列にレコードを追加できるのはなぜですか?たとえば、テーブルAの列Aを、テーブルBの列Bを参照する外部キーに設定します。ただし、テーブルBの列Bには存在しない列Aのレコードを追加できます。 私は私の外部キーを作成するために使用されていますので、最後のテーブルでは、テーブルを参照

CONSTRAINT fk_PaymentInfo_UserID FOREIGN KEY (UserID) REFERENCES Customer(CustomerID) 
+2

どのストレージバックエンドを使用していますか? InnoDBのみがIIRCというFK制約を強制します。 – BadZen

+0

こんにちはBadZen、それは実際問題でした。私はMyISAMを使用していました。 InnoDBに変更した後、それはうまくいった。 –

答えて

1
CREATE TABLE Weekday 
( WeekID INT PRIMARY KEY -- one of many options 
)engine=innodb; 

CREATE TABLE Flight 
( FlightID varchar(5) PRIMARY KEY -- one of many options 
)engine=innodb; 

CREATE TABLE FlightAndWeekday 
( WeekID int(1) NOT NULL, 
    FlightID varchar(5) NOT NULL, 
    PRIMARY KEY (WeekID, FlightID), 
    FOREIGN KEY fk_FAW_WeekId (WeekID) REFERENCES `Weekday`(`WeekID`), 
    FOREIGN KEY fk_FAW_FlightID (FlightID) REFERENCES `Flight`(`FlightID`) 
)engine=innodb; 

show create table FlightAndWeekday; 
CREATE TABLE `flightandweekday` (
    `WeekID` int(1) NOT NULL, 
    `FlightID` varchar(5) NOT NULL, 
    PRIMARY KEY (`WeekID`,`FlightID`), 
    KEY `fk_FAW_FlightID` (`FlightID`), 
    CONSTRAINT `flightandweekday_ibfk_1` FOREIGN KEY (`WeekID`) REFERENCES `weekday` (`WeekID`), 
    CONSTRAINT `flightandweekday_ibfk_2` FOREIGN KEY (`FlightID`) REFERENCES `flight` (`FlightID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

、あなたは複合主キー(の一部としてFlightIDを持っており、そのセグメントがない左ほとんど)、fk_FAW_FlightIDというヘルパーインデックスが作成されます。これとは対照的に

WeekIDは一番左のPKでをでそうヘルパーインデックスを作成する必要がないを参照です。

上記の解説

Using FOREIGN KEY Constraints

外部キーチェックが速くなり、テーブルスキャンを必要としないことができるようにMySQLの外部キーと参照キーのインデックスを必要と題したマニュアルページには、この抜粋に見られています。 参照表では、外部キー 列が同じ順序で最初の列としてリストされている索引が必要です。このような のインデックスは、 が存在しない場合は自動的に参照テーブルに作成されます。 外部キー制約を適用するために使用できる別のインデックスを作成すると、このインデックスは後で静かにドロップされることがあります。 index_nameが指定されている場合、前述のように使用されます。

私はFKのあなたの願いを尊重すると確信しています。

+0

あなたのご意見ありがとうございました。主な問題は、コードなどではありませんでした。私がInnoDBではなくMyISAMを使用していたという事実だけです。乾杯! –

+1

コメントではありませんでした。それは答えだった:p ....よくする – Drew

関連する問題