2016-04-28 7 views
0

多くの人と同様に、私もmySQLの悪名高いerrno 150に苦労しています。私はそれが外部キーと関係していることを知っていますが、この問題についてはすでに多くの質問があることを知っていますが、解決策を探し出すのにかなりの時間を費やした後、私はまだ特定のケースに合ったものを見つけることができません。ほぼすべてのエラーがこの旅行データベースから処理されましたが、この最終的なものは、脚付きのテーブルを作成しようとしたときに発生します。私はこれに関係するテーブルの下に掲載します。SQL 1005エラーのトラブル(errno 150)

CREATE TABLE ticket(
id int UNSIGNED NOT NULL, 
passenger_id int UNSIGNED, 
trip_id int UNSIGNED, 
leg_no int UNSIGNED, 
purchased_on datetime, 
reservation_date date, 
PRIMARY KEY(id), 
CONSTRAINT fk_ticket_passenger_id_passenger FOREIGN KEY 
(passenger_id) REFERENCES passenger(id), 
CONSTRAINT fk_ticket_trip_id_trip FOREIGN KEY 
(trip_id) REFERENCES trip(id), 
CONSTRAINT fk_ticket_leg_no_leg FOREIGN KEY 
(leg_no) REFERENCES leg(leg_no)); 

CREATE TABLE trip(
id int UNSIGNED NOT NULL, 
number_of_legs int UNSIGNED, 
PRIMARY KEY(id)); 

CREATE TABLE leg(
trip_id int UNSIGNED NOT NULL, 
leg_no int UNSIGNED NOT NULL, 
origin_id int UNSIGNED, 
destination_id int UNSIGNED, 
depart_time time, 
arrive_time time, 
vdesignation varchar(255), 
price decimal(13,2), 
PRIMARY KEY(trip_id, leg_no), 
CONSTRAINT fk_leg_trip_id_trip FOREIGN KEY 
(trip_id) REFERENCES trip(id), 
CONSTRAINT fk_leg_vdesignation_vehicle FOREIGN KEY 
(vdesignation) REFERENCES vehicle(designation), 
CONSTRAINT fk_leg_origin_id_island FOREIGN KEY 
(origin_id) REFERENCES island(id), 
CONSTRAINT fk_leg_destination_id_island FOREIGN KEY 
(destination_id) REFERENCES island(id)); 

CREATE TABLE vehicle(
designation varchar(255) NOT NULL, 
vtype varchar(255), 
capacity int UNSIGNED, 
PRIMARY KEY(designation)); 

CREATE TABLE island(
id int UNSIGNED NOT NULL, 
iname varchar(255), 
can_fly tinyint UNSIGNED, 
PRIMARY KEY(id)); 

私はこの質問には多くのことを尋ねます、と私はそれが古い取得すると確信している、私はあなたが私のために持っている可能性のあるアドバイスの信じられないほど感謝されることを認識しています。私は解決策をかなり徹底的に調査しており、それを把握しているようには見えません。あなたが私に与えることができる情報のおかげで、早めに!

編集:ここでは、エラーのために特定の警告情報です:

*************************** 1. row *************************** 
Level: Error 
Code: 1005 
Message: Can't create table 'travel.leg' (errno: 150) 
1 row in set (0.04 sec) 

EDIT 2:どういうわけか、私は最初の場所でそれを追加するのを忘れているので、最初の答えに応じて、車両テーブルを追加しました。

答えて

0

私はあなたのlegテーブルの外部キーを持つ2つの潜在的な問題を参照してください。最初の問題は、あなたが私たちにvehicle表を示さなかったので、私たち決してfk_leg_vdesignation外部キー

CONSTRAINT fk_leg_vdesignation_vehicle FOREIGN KEY (vdesignation) 
    REFERENCES vehicle(designation) 

である

1をdesignation列がleg.vdesignationと同じ型であることを確認できません。これはvarchar(255)です。タイプが一致しない場合、またはvehicle.designationが存在しない場合は、表示されている150のエラーが発生するはずです。 legの両方で

2.次の2つの外部キーはisland表に同じ列を参照することが表示されます。

CONSTRAINT fk_leg_origin_id_island FOREIGN KEY (origin_id) REFERENCES island(id) 
CONSTRAINT fk_leg_destination_id_island FOREIGN KEY (destination_id) REFERENCES island(id) 

私はそれらの両方を持つことのポイントが表示されていません。さらに、leg.origin_idおよびleg.destination_idのタイプはint UNSIGNEDであり、異種カラムisland.idのタイプはint UNSIGNED NOT NULLです。タイプがまったく同じではないので、これはエラー150を引き起こす可能性があります。

+0

あなたの言ったことに応じて車のテーブルを追加しました。残念ながら、型が一致するように見え、 'leg.origin_id'と' leg_destination_id'を 'NOT NULL'と宣言してもエラーは解決されません。彼らが両方とも同じ列を参照する方法についてのあなたのコメントに応じて、私はそれらの両方を含めることができない方法が不明です。旅行の各レグは起点と目的地の両方を持ち、どちらも常に 'island.id'値を参照します。これを行うより適切な方法がありますか? – Geoiv04

+0

私はあなたが思ったことをやったとは思わない。あなたは本当に「車両」テーブルを持っていませんでしたか? –

+0

いいえ、私は1つ持っていた、私は単に元の投稿にそれを含めることを忘れました。 – Geoiv04

0

突然の直感でそれを理解してしまいました。この問題は実際にはticketテーブルから発生しています。この問題を解決するために、テーブルの最後の2つの外部キーを組み合わせました。これは私がこのことから私の制約を変更することを意味します。これに

CONSTRAINT fk_ticket_trip_id_trip FOREIGN KEY 
(trip_id) REFERENCES trip(id), 
CONSTRAINT fk_ticket_leg_no_leg FOREIGN KEY 
(leg_no) REFERENCES leg(leg_no)); 

:何が悪かったのかの

CONSTRAINT fk_ticket_leg_no_leg FOREIGN KEY 
(trip_id, leg_no) REFERENCES leg(trip_id, leg_no)); 

私の理解では、外部キーが別のテーブルの主キーを参照するようになっているということです。 2つの外部キーのうちの2番目の外部キーがleg.leg_noを参照すると、キーの一部のみを参照していました。 leg.leg_noはプライマリキーのプライマリ属性ですが、それ自体はテーブルの特定の行を識別できないため、外部キー参照として適切に機能しません。

Timさんを手伝ってくれてありがとうございます! 2つの外部キーが同じキーを参照するというあなたのコメントがなければ、私は決してこれを考えなかったかもしれません。

関連する問題