0

我有看起来像这样的语言表:

 -id
 -name
 -iso

在多个表中,我需要将此iso字段引用为外键。问题是,即使我给出完全唯一的 FK 名称,我也做不到。什么是问题?

这是我的 Languages 表的构造方式:

CREATE TABLE `Languages` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `iso` char(2) NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `order` tinyint(3) NOT NULL DEFAULT '0',
  `active` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
4

1 回答 1

0

确保在父表和子表中具有相同的列数据类型。还要在父表的 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)
);

我还建议您的依赖外键的子表也应该被索引。查看一篇关于外键的不错的小文章

于 2013-09-14T14:32:26.793 回答