首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL错误代码1215:无法添加外键约束

问MySQL错误代码1215:无法添加外键约束
EN

Stack Overflow用户
提问于 2014-07-09 20:52:12
回答 3查看 6.4K关注 0票数 1

我对SQL非常陌生,我试图定义一个2个表Hospital和Hospital_Address,但是当我试图在Hospital_Address中添加外键时,它会抛出一个错误:"1215: Cannot add foreign key“

代码语言:javascript
复制
create table Hospital (
             HId Int not null,  
           HName varchar(40) not null, 
           HDept int, Hbed Int, 
         HAreaCd int not null, 
         Primary Key (HId)
                      );

create table Hospital_Address (
                HAreaCd Int not null,
                  HArea varchar(40) not null,
                  HCity varchar(40), 
                  HAdd1 varchar(40),
                  HAdd2 varchar(40), 
                  Primary Key (HArea), 
                 foreign key (HAreaCd) references Hospital (HAreaCd));

请在这方面帮助我。提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-09 21:05:07

MySQL要求父Hospital表中的HAreaCd列上有一个索引,以便在外键约束中引用该列。

规范模式是让外键引用父表的主键,尽管MySQL扩展了该模式以允许外键引用作为唯一键的列,而InnoDB则将其扩展(超出了SQL标准),并允许外键引用任何列集,只要存在以这些列作为前导列的索引(按照在外键约束中指定的相同顺序)。(也就是说,在InnoDB中,引用的列不需要是唯一的,尽管具有这种关系的行为可能不是您想要的。)

如果在Hospital表中为该列创建索引,例如:

代码语言:javascript
复制
CREATE INDEX Hospital_IX1 ON Hospital (HAreaCd);

然后,可以创建引用该列的外键约束。

但是,因为这是MySQL和InnoDB的非标准扩展,所以“最佳实践”(如这里的其他答案所示)是由FOREIGN KEY引用外部表的PRIMARY KEY。理想情况下,这将是一个单一的列。

考虑到Hospital表的现有定义,引用外键的一个更好的选项是将Hid列添加到Hospital_Address表中

代码语言:javascript
复制
... ADD HId Int COMMENT 'FK ref Hospital.HId'

... ADD CONSTRAINT FK_Hospital_Address_Hospital 
       FOREIGN KEY (HId) REFERENCES Hospital (HId)

要建立行之间的关系,需要填充新的HId列的值。

票数 5
EN

Stack Overflow用户

发布于 2014-07-09 20:59:19

通常不能将外键添加到另一个表的非主键元素中。

如果您确实需要这样做,请参考以下问题以获得帮助:Foreign Key to non-primary key

票数 1
EN

Stack Overflow用户

发布于 2014-07-09 20:58:31

医院表中的HAreaCd应该是主键。只有这样,才能在Hospital_Address表中引用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24663595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档