我是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));
Run Code Online (Sandbox Code Playgroud)
请帮助我这方面.提前致谢.
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);
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建引用该列的外键约束.
但是,因为这是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)
Run Code Online (Sandbox Code Playgroud)
要建立行之间的关系,HId需要填充新列的值.