MySQL Error 150 - PullRequest
       10

MySQL Error 150

1 голос
/ 26 марта 2012

Я пытаюсь создать скрипт для нормализации другой таблицы в MySQL.Вот что у меня есть:

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;

Этот код приводит к этой ошибке:

Невозможно создать таблицу hw7.airport_codenames errno: 150

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Поскольку airport_codes имеет несколько возможных строк на airport_code и airline_code (как составной ключ), другие внешние ключи не могут ссылаться на него.Переместите отношения FK в airport_codes, указывая на airport_locations и airport_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 голосов
/ 26 марта 2012

Должен исходить от вас порядок столов дропа. Как MySQL Док сказать

InnoDB не разрешает вам отбрасывать таблицу, на которую ссылается ограничение FOREIGN KEY, если вы не установили SET foreign_key_checks = 0

Поэтому установите проверку внешнего ключа по праву или измените порядок сброса на:

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

Вы опускаете внешний ключ перед ссылкой.

...