确保在父表和子表中具有相同的列数据类型。还要在父表的 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)
);
我还建议您的依赖外键的子表也应该被索引。查看一篇关于外键的不错的小文章。