2012-03-26 9 views
1

私はMySQLの別のテーブルを正規化するためのスクリプトを作成しようとしています。以下は、私が持っているものです。MySQLのエラー150

USE hw7; 

SET foreign_key_checks = 0; 
DROP TABLE IF EXISTS airport_codes; 
DROP TABLE IF EXISTS airport_locations; 
DROP TABLE IF EXISTS airport_codenames; 
SET foreign_key_checks = 1; 

CREATE TABLE airport_codes(
airport_code char(3) not null, 
airline_code char(2) not null, 
primary key (airport_code, airline_code) 
); 

INSERT INTO airport_codes SELECT DISTINCT airport_code, airline_code 
    FROM airport_airlines; 

CREATE TABLE airport_locations(
airport_code char(3) not null, 
city varchar(20) not null, 
state char(2) not null, 
primary key (airport_code), 
constraint ap_code_fk 
    foreign key (airport_code) 
    references airport_codes(airport_code) 
); 

INSERT INTO airport_locations SELECT DISTINCT airport_code, city, state 
    FROM airport_airlines; 

CREATE TABLE airport_codenames(
airline_code char(2) not null, 
name varchar(20) not null, 
primary key (airline_code), 
constraint al_code_fk 
    foreign key (airline_code) 
    references airport_codes(airline_code) 
); 

INSERT INTO airport_codenames SELECT DISTINCT airline_code, name 
    FROM airport_airlines; 

このエラーでこのコードの結果は:

Can't create table hw7.airport_codenames errno:150

+0

これらのFK関係は逆のように見えます。典型的には、 'airport_codenames'がプライマリテーブルであり、' airport_codes'は 'airport_codenames'にFKを持ちます。同様に、 'airport_locations'はPKテーブルになり、' airport_codes'にはFKが入ります。両方とも後方に見える... –

+0

空港コード、市町村 名前 – kmaz13

+0

しかし、airport_locationsの 'airport_code'に複数の' airline_code'を指定した場合(コンポジットキー)、それは 'airport_codenames'からのforeign keyを' airport_locations'の複数の行を指し示すので、それを分解します。私はそれがあなたの問題の原因だと思う。 –

答えて

1

airport_codesは、airport_codeおよびairline_code(複合キーとして)ごとに複数の可能な行を持つため、他の外部キーで参照することはできません。 FKの関係をairport_codesに移動し、airport_locationsairport_codenamesを指す。

USE hw7; 

SET foreign_key_checks = 0; 
DROP TABLE IF EXISTS airport_codes; 
DROP TABLE IF EXISTS airport_locations; 
DROP TABLE IF EXISTS airport_codenames; 
SET foreign_key_checks = 1; 


CREATE TABLE airport_locations(
airport_code char(3) not null, 
city varchar(20) not null, 
state char(2) not null, 
primary key (airport_code) 
); 

INSERT INTO airport_locations SELECT DISTINCT airport_code, city, state 
    FROM airport_airlines; 

CREATE TABLE airport_codenames(
airline_code char(2) not null, 
name varchar(20) not null, 
primary key (airline_code) 
); 

INSERT INTO airport_codenames SELECT DISTINCT airline_code, name 
    FROM airport_airlines; 


/* airport_codes moved after the other 2 tables, and FKs defined here */ 
CREATE TABLE airport_codes(
airport_code char(3) not null, 
airline_code char(2) not null, 
primary key (airport_code, airline_code), 
/* FK relationships are defined here, rather than in the other tables, 
    since the PKs for airport_code and airline_code are defined in the 
    other tables. 
*/ 
constraint ap_code_fk 
    foreign key (airport_code) 
    references airport_locations (airport_code), 
constraint al_code_fk 
    foreign key (airline_code) 
    references airport_codenames (airline_code) 
); 

INSERT INTO airport_codes SELECT DISTINCT airport_code, airline_code 
    FROM airport_airlines; 
+0

ああ、私は今参照してください。これは、私が試みていたものよりずっと理にかなっています。すべてのあなたの助けをありがとう!私はあなたが何度もあなたを描写してくれることを願っています。良い一日を過ごしてください。 – kmaz13

0

それはテーブルの順序をドロップあなたから来なければなりません。あなたが参照する前に、外部キーをドロップする

DROP TABLE IF EXISTS airport_locations; 
DROP TABLE IF EXISTS airport_codenames; 
DROP TABLE IF EXISTS airport_codes; 

:mysqlのドキュメントと同様

InnoDB does not permit you to drop a table that is referenced by a FOREIGN KEY constraint, unless you do SET foreign_key_checks = 0

だから当然、外部キーチェックを設定するかであなたのドロップ順序を変更すると言います。

+0

um、上記のコードをもう一度読んでください。 'SET foreign_key_checks = 0'はテーブルが削除される直前に発生します。 –

+0

申し訳ありません私の悪い、あなたの外来のキーの参照を探していた – grifos

+0

マイケルは言ったように、私は私のスクリプトの部分が正しいと思う。試してくれてありがとう。私はまだこれを理解することはできません。 – kmaz13

関連する問題