我是SQL的新手,我正在尝试定义2个表Hospital
和Hospital_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));
请在这方面帮助我。提前谢谢。
答案 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表中引用它