MySQL多字段外键引用到单个字段

时间:2013-09-14 14:04:41

标签: mysql database

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

 -id
 -name
 -iso

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

以下是我的语言表的构建方式:

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;

1 个答案:

答案 0 :(得分: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)
);

我还建议您依赖外键的子表也应编入索引。看看一个不错的小article on foreign keys