親テーブルと子テーブルの列のデータ型が同じであることを確認してください。親テーブルの iso 列にもインデックスを作成します。現在所有しているテーブルとそれらに使用した SQL に関する質問に詳細がないため、データベースと比較できる例をいくつか挙げてみましょう。
異なるデータ型の例:
create table languages (
id int,
name varchar(100),
iso char(3),
primary key(id)
);
create index ix_countries_iso on languages(iso);
create table countries (
id int,
iso int,
foreign key(iso) references languages(iso)
);
ERROR 1215 (HY000): Cannot add foreign key constraint
親テーブルの欠落インデックスの例:
create table languages (
id int,
name varchar(100),
iso char(3),
primary key(id)
);
-- notice that we aren't creating an index on iso
create table countries (
id int,
iso char(3), -- notice correct datatype in child and parent table
foreign key(iso) references languages(iso)
);
ERROR 1215 (HY000): Cannot add foreign key constraint
親と子のデータ型が同じで長さが異なる場合はどうなりますか? データ型と長さを同じに保つことをお勧めしますが、次のステートメントは機能します。
create table languages (
id int,
name varchar(100),
iso char(3),
primary key(id)
);
create index ix_countries_iso on languages(iso);
create table countries (
id int,
iso char(10), -- will work, but don't do this
foreign key(iso) references languages(iso)
);
create table countries2 (
id int,
iso char(1), -- will work also, but don't do this
foreign key(iso) references languages(iso)
);
データベース構造と比較できる外部キーの実用的なソリューションの例を見てみましょう。
create table languages (
id int,
name varchar(100),
iso char(3),
primary key(id)
);
create index ix_countries_iso on languages(iso);
create table countries (
id int,
iso char(3), -- same datatype
foreign key fq_countries_languages(iso) references languages(iso)
);
create table boundaries (
id int,
iso char(3), -- same datatype
foreign key fq_boundaries_languages(iso) references languages(iso)
);
また、外部キーに依存する子テーブルにもインデックスを作成することをお勧めします。外部キーに関するちょっとした記事をチェックしてください。