因此,我尝试将外键约束作为项目要求添加到数据库中,它第一次或两次在不同的表上工作,但我有两个表,在尝试添加外键约束时出错。
我得到的错误消息是:
错误1215(HY000):无法添加外键约束
这是我用来创建表的SQL,两个有问题的表是Patient和Appointment
设置@OLD\u UNIQUE\u [email protected]@UNIQUE\u CHECKS,UNIQUE\u CHECKS=0;
设置@[email protected]@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=1;
设置@[email protected]@SQL_MODE,SQL_MODE='TRADITIONAL,允许无效的日期';
创建架构(如果不存在)`DoctorOffice`默认字符集utf8;
使用“博士办公室”;
-- -----------------------------------------------------
--表“医生办公室”。“医生”`
-- -----------------------------------------------------
删除表(如果存在)`doctoroffice`.`doctor`;
如果不存在“DoctorOffice”,则创建表。“doctor”(
`DoctorID`INT(11)非空自动增量,
`FName`VARCHAR(20)NULL默认为NULL,
`LName`VARCHAR(20)NULL默认为NULL,
`Gender`VARCHAR(1)NULL默认为NULL,
`专业“VARCHAR(40)不为空默认为“全科医生”,
唯一索引'DoctorID'('DoctorID'ASC),
主键(`DoctorID`)
引擎=InnoDB
默认字符集=utf8;
-- -----------------------------------------------------
--表“医生办公室”。“医疗历史”`
-- -----------------------------------------------------
删除表格(如果存在)`DoctorOffice`.`medicalhistory`);
创建表(如果不存在)`DoctorOffice`.`medicalhistory`(
`MedicalHistoryID`INT(11)非空自动增量,
`过敏反应`文本为空默认为空,
`“文本为空默认为空,
`ExistingConditions`文本为空默认为空,
`Misc`文本为空默认为空,
唯一索引'MedicalHistoryID'('MedicalHistoryID'ASC),
主键(`MedicalHistoryID`)
引擎=InnoDB
默认字符集=utf8;
-- -----------------------------------------------------
--表“医生办公室”。“患者”`
-- -----------------------------------------------------
如果存在“医生办公室”或“患者”,则删除表格;
创建表(如果不存在)`doctoroffice`.`Patient`(
`PatientID`INT无符号非空自动增量,
`FName`VARCHAR(30)NULL,
`LName`VARCHAR(45)NULL,
`性别`字符为空,
`日期为空,
`SSN`双空,
`MedicalHistory`smallint(5)无符号非空,
`PrimaryMedicine`smallint(5)无符号非空,
主键(`PatientID`),
唯一索引'PatientID_UNIQUE'('PatientID'ASC),
约束'FK_医学史`
外键(`MEdicalHistory`)
参考文献`doctoroffice`.`medicalhistory`(`MedicalHistoryID`)
关于删除级联
在更新级联上,
约束'FK_PrimaryMedicine`
外键(`PrimaryMedicine`)
参考文献`doctoroffice`.`doctor`(`DoctorID`)
关于删除级联
更新时(级联)
引擎=InnoDB;
-- -----------------------------------------------------
--表`医生办公室'.`预约`
-- -----------------------------------------------------
删除表格(如果存在)`doctoroffice`.`Appointment`);
如果“DoctorOffice”不存在,则创建表。“约会”(
`AppointmentID`smallint(5)无符号非空自动增量,
`日期`日期为空,
`时间`时间为空,
`Patient`smallint(5)未签名非空,
`Doctor`smallint(5)无符号非空,
主键(`AppointmentID`),
唯一索引'AppointmentID_UNIQUE'('AppointmentID'ASC),
约束“FK_患者”`
外键(`Patient`)
参考文献`doctoroffice`.`Patient`(`PatientID`)
关于删除级联
在更新级联上,
“FK_医生”`
外键(`Doctor`)
参考文献`doctoroffice`.`doctor`(`DoctorID`)
关于删除级联
更新时(级联)
引擎=InnoDB;
-- -----------------------------------------------------
--表“医生办公室”。“保险公司”`
-- -----------------------------------------------------
删除表格(如果存在)`doctoroffice`.`InsuranceCompany`);
创建表(如果不存在)`DoctorOffice`.`InsuranceCompany`(
`InsuranceID`smallint(5)非空自动增量,
`Name`VARCHAR(50)NULL,
`电话`双空,
主键(`InsuranceID`),
唯一索引'InsuranceID_UNIQUE'('InsuranceID'ASC))
引擎=InnoDB;
-- -----------------------------------------------------
--表“医生办公室”。“病人保险”`
-- -----------------------------------------------------
删除表格(如果存在)`doctoroffice`.`PatientInsurance`);
创建表(如果不存在)`DoctorOffice`.`PatientInsurance`(
`投保人“smallint(5)不为空,
`保险公司'smallint(5)不为空,
`CoPay`INT不为空默认值5,
`PolicyNumber`smallint(5)非空自动增量,
主键(`PolicyNumber`),
唯一索引'PolicyNumber\u UNIQUE'('PolicyNumber'ASC),
限制` FK_保单持有人`
外键(`policycholder`)
参考文献`doctoroffice`.`Patient`(`PatientID`)
关于删除级联
在更新级联上,
限制` FK_保险公司`
外键(`InsuranceCompany`)
参考“医生办公室”。“保险公司”(“保险ID”)
关于删除级联
更新时(级联)
引擎=InnoDB;
使用“博士办公室”;
设置SQL\u模式[email protected]\u SQL\u模式;
设置外键检查[email protected]\u FOREIGN\u KEY\u CHECKS;
设置唯一检查[email protected]\u UNIQUE\u CHECKS;
要查找特定错误,请运行以下命令:
显示引擎INNODB状态;
并查看最新外键错误部分
子列的数据类型必须与父列完全匹配。例如,由于medicalhistory.MedicalHistoryID是INT,患者。medicalhistory也需要是INT,而不是SMALLINT
此外,在运行DDL之前,您应该运行查询set foreign\u key\u checks=0,这样您就可以按任意顺序创建表,而无需在相关子表之前创建所有父表