Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL错误代码1215:无法添加外键约束_Mysql_Sql - Fatal编程技术网

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

MySQL错误代码1215:无法添加外键约束,mysql,sql,Mysql,Sql,我对SQL非常陌生,我试图定义两个表Hospital和Hospital\u Address,但当我试图在Hospital\u Address中添加外键时,它抛出一个错误:“1215:无法添加外键” 请在这方面帮助我。提前感谢。医院表中的HAreaCd应该是主键。只有这样,您才能在医院地址表中引用它。医院表中的HAreaCd应该是主键。只有这样,您才能在Hospital_Address表中引用它。通常,您不能将外键添加到另一个表的非主键元素中 如果确实需要这样做,请参阅此问题以获取帮助:通常不能将

我对SQL非常陌生,我试图定义两个表
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之外的扩展