MySQL错误代码1215:无法添加外键约束
我对SQL非常陌生,我试图定义两个表MySQL错误代码1215:无法添加外键约束,mysql,sql,Mysql,Sql,我对SQL非常陌生,我试图定义两个表Hospital和Hospital\u Address,但当我试图在Hospital\u Address中添加外键时,它抛出一个错误:“1215:无法添加外键” 请在这方面帮助我。提前感谢。医院表中的HAreaCd应该是主键。只有这样,您才能在医院地址表中引用它。医院表中的HAreaCd应该是主键。只有这样,您才能在Hospital_Address表中引用它。通常,您不能将外键添加到另一个表的非主键元素中 如果确实需要这样做,请参阅此问题以获取帮助:通常不能将
Hospital
和Hospital\u Address
,但当我试图在Hospital\u Address
中添加外键时,它抛出一个错误:“1215:无法添加外键
”
请在这方面帮助我。提前感谢。医院表中的HAreaCd应该是主键。只有这样,您才能在医院地址表中引用它。医院表中的HAreaCd应该是主键。只有这样,您才能在Hospital_Address表中引用它。通常,您不能将外键添加到另一个表的非主键元素中
如果确实需要这样做,请参阅此问题以获取帮助:通常不能将外键添加到另一个表的非主键元素中
如果确实需要这样做,请参考此问题以获取帮助:MySQL要求父
医院
表中的HAreaCd
列上有一个索引,以便在外键约束中引用该列
标准模式是外键引用父表的主键,尽管MySQL扩展了该模式以允许外键引用唯一键的列,InnoDB扩展了该模式(超出SQL标准),并允许外键引用任何列集,只要存在一个以这些列作为前导列的索引(与外键约束中指定的顺序相同)(也就是说,在InnoDB中,引用的列不需要是唯一的,尽管这种关系的行为可能不是您想要的。)
如果您在Hospital
表中的该列上创建索引,例如:
CREATE INDEX Hospital_IX1 ON Hospital (HAreaCd);
然后可以创建引用该列的外键约束
但是,由于这是MySQL和InnoDB的非标准扩展,“最佳实践”(如这里的其他答案所示)是使用
外键
引用外键表的主键。理想情况下,这将是一列
鉴于Hospital
表的现有定义,外键引用它的更好选项是将Hid
列添加到Hospital\u Address
表中
... ADD HId Int COMMENT 'FK ref Hospital.HId'
... ADD CONSTRAINT FK_Hospital_Address_Hospital
FOREIGN KEY (HId) REFERENCES Hospital (HId)
要建立行之间的关系,需要填充新的HId
列的值。MySQL要求父Hospital
表中的HAreaCd
列上有一个索引,以便在外键约束中引用该列
标准模式是外键引用父表的主键,尽管MySQL扩展了该模式以允许外键引用唯一键的列,InnoDB扩展了该模式(超出SQL标准),并允许外键引用任何列集,只要存在一个以这些列作为前导列的索引(与外键约束中指定的顺序相同)(也就是说,在InnoDB中,引用的列不需要是唯一的,尽管这种关系的行为可能不是您想要的。)
如果您在Hospital
表中的该列上创建索引,例如:
CREATE INDEX Hospital_IX1 ON Hospital (HAreaCd);
然后可以创建引用该列的外键约束
但是,由于这是MySQL和InnoDB的非标准扩展,“最佳实践”(如这里的其他答案所示)是使用外键
引用外键表的主键。理想情况下,这将是一列
鉴于Hospital
表的现有定义,外键引用它的更好选项是将Hid
列添加到Hospital\u Address
表中
... ADD HId Int COMMENT 'FK ref Hospital.HId'
... ADD CONSTRAINT FK_Hospital_Address_Hospital
FOREIGN KEY (HId) REFERENCES Hospital (HId)
要建立行之间的关系,需要填充新的HId
列的值。好的,意味着只有一个表的主键可以是第二个表的外键?确切地说,如果第二个表的键存在于第一个表中并且是主键,则第二个表可以有一个外键。实际上,InnoDB允许外键引用表中的任何列集,只要定义了适当的索引。标准模式是外键引用表的主键或唯一键,但InnoDB超出了SQL标准,允许引用非唯一的列集。(这是非标准行为,如果理解不好,这样一个外键的行为可能是意外的和违反直觉的。)好的,意味着只有一个表的主键可以是第二个表的外键?确切地说,如果第二个表的键存在于第一个表中并且是主键,则第二个表可以有一个外键。实际上,InnoDB允许外键引用表中的任何列集,只要定义了适当的索引。标准模式是外键引用表的主键或唯一键,但InnoDB超出了SQL标准,允许引用非唯一的列集。(这是一种非标准行为,如果理解得不好,这样一个外键的行为可能是意外的和违反直觉的。)实际上,InnoDB允许外键约束引用任何一组列,只要该组列上定义了适当的索引。这是SQL标准之外的扩展;规范模式是参照的主键;但它也可能引用一个唯一的密钥。(当一个外键引用一组非唯一的列时,如果不理解,这种行为可能是意外的。)实际上,InnoDB允许外键约束引用任何一组列,只要该组列上定义了适当的索引。这是SQL st之外的扩展