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

时间:2014-07-09 20:52:12

标签: mysql sql

我是SQL的新手,我正在尝试定义2个表HospitalHospital_Address但是当我尝试在Hospital_Address中添加外键时,它会抛出一个错误:"1215: Cannot add foreign key

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));

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

3 个答案:

答案 0 :(得分:5)

MySQL要求父HAreaCd表中的Hospital列上有索引,以便您在FOREIGN KEY约束中引用该列。

规范模式是FOREIGN KEY引用父表的PRIMARY KEY,尽管MySQL扩展它以允许FOREIGN KEY引用一个UNIQUE KEY的列,而InnoDB扩展它(超出SQL标准)并且允许FOREIGN KEY引用任何列集,只要有一个索引将这些列作为前导列(以外键约束中指定的相同顺序)。(即,在InnoDB中,引用的列做不需要是唯一的,尽管这种关系的行为可能不是你想要的。)

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

CREATE INDEX Hospital_IX1 ON Hospital (HAreaCd);

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


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

鉴于Hospital表的现有定义,引用它的外键的更好选择是将Hid列添加到Hospital_Address

... ADD HId Int COMMENT 'FK ref Hospital.HId'

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

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

答案 1 :(得分:1)

您通常无法将外键添加到另一个表的非主键元素中。

如果您确实需要这样做,请参阅此问题寻求帮助:Foreign Key to non-primary key

答案 2 :(得分:0)

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