1

我正在尝试创建一个脚本来规范化 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

4

2 回答 2

1

由于airport_codes每个airport_codeand有多个可能的行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;
于 2012-03-26T03:09:25.757 回答
0

它应该来自你的drop table order。就像mysql doc说的

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;

在引用之前删除外键。

于 2012-03-26T02:51:53.827 回答