如何使用MySQL使用外键引用复合主键

时间:2014-11-12 16:10:19

标签: mysql database primary-key foreign-key-relationship composite-primary-key

我尝试在表 cell_lines 中设置一个外键,该表将引用表 topographic_regions 中复合主键的 topographic_region 列强>

每次我运行最后三行代码试图添加外键时,我收到错误代码1215:无法添加外键约束。

现在, cell_lines 中的外键列名称( topographic_region )仅匹配 topographic_regions 中的一个复合主键列名称,其他复合主键列名称为 topographic_region_id 。在创建外键时,我是否经常需要处理复合主键的两个组件?

后续问题是我实际上已经尝试使用复合外键约束来解决复合主键的两个组件,但我仍然看到错误代码1215:无法添加外键约束。

我可以做些什么来解决这个问题,是否还有您希望我提供的信息?我很乐意回应。

感谢阅读。我是mySQL的新手。

create table topographic_regions(
topographic_regions_id int not null auto_increment,
topographic_region int(10),
karyotypes varchar(255),
constraint pk_topographicID primary key (topographic_regions_id, topographic_region)
);

create table cell_lines(
cell_lines_id int not null auto_increment,
cell_line varchar(50),
topographic_region int(10),
constraint pk_cellID primary key (cell_lines_id, cell_line)
);

alter table cell_lines
add foreign key (topographic_region) 
references topographic_regions(topographic_region);

2 个答案:

答案 0 :(得分:0)

这是复合PK的问题。实际上,您的自动编号topographic_region_id将是唯一的,您应该将其用于PK和FK。 topographic_region听起来也很独特,所以你应该为它添加一个唯一的索引。

答案 1 :(得分:0)

外键是某些列,其子行值必须在另一个表中作为子行值显示,它们是候选键。如果你确实有一个从cell_lines到topographic_regions的外键,那么cell_lines将有一个topographic_region_name列,你需要:

alter table cell_lines
add foreign key (topographic_regions_id, topographic_region) 
references topographic_regions(topographic_regions_id, topographic_region);

我怀疑(topographic_regions_id,topographic_region)是topographic_regions的候选键,而topographic_regions_id足以识别某个区域,因为您认为cell_lines没有topographic_region列。虽然细胞系可能不识别特定的地形区域。但是topographic_regions_id不是cell_lines中的外键,因为它不是topographic_regions中的键。 (在SQL中没有简单的方法来限制某些列的子行值必须在另一个表中显示为子行值,而不是候选键的超集。)

如果topographic_regions_id在topographic_regions中是唯一的,则它是候选键,应该声明为UNIQUE NOT NULL。如果topographic_region_name在topographic_regions中是唯一的,则它是候选键,应该声明为UNIQUE NOT NULL。如果其中一个是候选键,则(topographic_regions_id,topographic_region)不是候选键。您可以选择一个候选键来声明PRIMARY KEY,这意味着UNIQUE NOT NULL。同样适用于cell_line。由于你的_id列是auto_increment,我怀疑它们是唯一的,在这种情况下,两个表都没有复合候选键。

(所有这些假设您的列都不能为NULL。)