因此,我尝试将外键约束作为项目要求添加到数据库中,它第一次或两次在不同的表上工作,但有两个表在尝试添加外键约束时出错。我得到的错误消息是:
错误1215(hy000):无法添加外键约束
这是我用来创建表的sql,两个有问题的表是 Patient
以及 Appointment
.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `doctorsoffice` DEFAULT CHARACTER SET utf8 ;
USE `doctorsoffice` ;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`doctor`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`doctor` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`doctor` (
`DoctorID` INT(11) NOT NULL AUTO_INCREMENT ,
`FName` VARCHAR(20) NULL DEFAULT NULL ,
`LName` VARCHAR(20) NULL DEFAULT NULL ,
`Gender` VARCHAR(1) NULL DEFAULT NULL ,
`Specialty` VARCHAR(40) NOT NULL DEFAULT 'General Practitioner' ,
UNIQUE INDEX `DoctorID` (`DoctorID` ASC) ,
PRIMARY KEY (`DoctorID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`medicalhistory`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`medicalhistory` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`medicalhistory` (
`MedicalHistoryID` INT(11) NOT NULL AUTO_INCREMENT ,
`Allergies` TEXT NULL DEFAULT NULL ,
`Medications` TEXT NULL DEFAULT NULL ,
`ExistingConditions` TEXT NULL DEFAULT NULL ,
`Misc` TEXT NULL DEFAULT NULL ,
UNIQUE INDEX `MedicalHistoryID` (`MedicalHistoryID` ASC) ,
PRIMARY KEY (`MedicalHistoryID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Patient`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Patient` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`Patient` (
`PatientID` INT unsigned NOT NULL AUTO_INCREMENT ,
`FName` VARCHAR(30) NULL ,
`LName` VARCHAR(45) NULL ,
`Gender` CHAR NULL ,
`DOB` DATE NULL ,
`SSN` DOUBLE NULL ,
`MedicalHistory` smallint(5) unsigned NOT NULL,
`PrimaryPhysician` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`PatientID`) ,
UNIQUE INDEX `PatientID_UNIQUE` (`PatientID` ASC) ,
CONSTRAINT `FK_MedicalHistory`
FOREIGN KEY (`MEdicalHistory` )
REFERENCES `doctorsoffice`.`medicalhistory` (`MedicalHistoryID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_PrimaryPhysician`
FOREIGN KEY (`PrimaryPhysician` )
REFERENCES `doctorsoffice`.`doctor` (`DoctorID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Appointment`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Appointment` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`Appointment` (
`AppointmentID` smallint(5) unsigned NOT NULL AUTO_INCREMENT ,
`Date` DATE NULL ,
`Time` TIME NULL ,
`Patient` smallint(5) unsigned NOT NULL,
`Doctor` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`AppointmentID`) ,
UNIQUE INDEX `AppointmentID_UNIQUE` (`AppointmentID` ASC) ,
CONSTRAINT `FK_Patient`
FOREIGN KEY (`Patient` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_Doctor`
FOREIGN KEY (`Doctor` )
REFERENCES `doctorsoffice`.`doctor` (`DoctorID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`InsuranceCompany`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`InsuranceCompany` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`InsuranceCompany` (
`InsuranceID` smallint(5) NOT NULL AUTO_INCREMENT ,
`Name` VARCHAR(50) NULL ,
`Phone` DOUBLE NULL ,
PRIMARY KEY (`InsuranceID`) ,
UNIQUE INDEX `InsuranceID_UNIQUE` (`InsuranceID` ASC) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`PatientInsurance`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`PatientInsurance` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`PatientInsurance` (
`PolicyHolder` smallint(5) NOT NULL ,
`InsuranceCompany` smallint(5) NOT NULL ,
`CoPay` INT NOT NULL DEFAULT 5 ,
`PolicyNumber` smallint(5) NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`PolicyNumber`) ,
UNIQUE INDEX `PolicyNumber_UNIQUE` (`PolicyNumber` ASC) ,
CONSTRAINT `FK_PolicyHolder`
FOREIGN KEY (`PolicyHolder` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_InsuranceCompany`
FOREIGN KEY (`InsuranceCompany` )
REFERENCES `doctorsoffice`.`InsuranceCompany` (`InsuranceID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
USE `doctorsoffice` ;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
22条答案
按热度按时间nimxete21#
在我的例子中,有一个语法错误,在运行查询时mysql控制台没有显式地通知它。然而,
SHOW ENGINE INNODB STATUS
命令的LATEST FOREIGN KEY ERROR
报告的部分,我不得不在两个空格之间留下一个空格
REFERENCES
以及role
让它工作。2sbarzqh2#
注意:下面的表格是我在数据库上做一些研究和开发时从某个站点获取的。所以命名约定不合适。
对我来说,问题是,我的父表与我正在创建的表具有不同的字符集。
父表(产品)
有问题的子表(price\u logs)
修改为
w41d8nur3#
我也遇到了同样的问题,然后在父表和子表中将引擎名更正为innodb,并更正了引用字段名foreign key(
c_id
)参考文献x9o_parent_table
(c_id
)然后工作正常,表安装正确。这对某人来说是完全有用的。
r3i60tvu4#
我把一个字段设置为“unsigned”,另一个没有。一旦我将两列都设置为unsigned,它就工作了。
khbbv19g5#
对于不同表的两个外键,我遇到了类似的错误,但它们的键名相同!我已重命名密钥,错误已消失)
wfauudbj6#
尝试使用相同类型的主键-int(11)-在外键-smallint(5)-上。
希望有帮助!
vjrehmav7#
检查表中两列的签名。如果引用的表列被签名,那么引用的表列也应该被签名。
whlutmcx8#
对我来说,如果为引用当前db的非当前db创建fk,则不能忽略在当前db表前面加前缀:
如果省略users表的“current\u db.”,则得到fk错误。有趣的是显示引擎innodb状态;在这种情况下什么也没显示。
gzszwxb49#
要在表b中设置外键,必须在表a中设置一个键。
表a:索引
id
(id
)然后在表b中,
2guxujil10#
我也有同样的问题,解决方法很简单。解决方案:表中声明的外键不应设置为NOTNULL。
引用:如果指定set null操作,请确保没有将子表中的列声明为not null(参考)
czq61nw111#
检查以下规则:
首先检查是否为表名指定了正确的名称
第二个正确的数据类型给外键?
lfapxunr12#
我的解决方案可能有点尴尬,告诉你为什么有时你应该看看你面前的东西,而不是这些帖子:)
我以前运行过一个前向工程师,但失败了,这意味着我的数据库已经有了一些表,然后我一直坐在那里试图修复外键约束失败,试图确保一切都是完美的,但是它遇到了以前创建的表,所以它是不占优势的。
kupeojn613#
请确保两个表都是innodb格式。即使是myisam格式,外键约束也不会起作用。
另外,还有一点是,两个字段的类型应该相同。如果一个是int,那么另一个也应该是int。如果一个是varchar,那么另一个也应该是varchar,以此类推。
wgxvkvu914#
我面对了这个问题,并通过确保数据类型完全匹配来解决它。
我使用sequepro来添加约束,并且默认情况下它将主键设置为unsigned。
uyto3xhc15#
我在一个多对多表中创建外键时遇到了类似的错误,其中主键由两个外键和另一个普通列组成。我通过更正引用的表名,即company,解决了这个问题,如下面更正的代码所示: