MySQL创建含外键的Schema时抛出1215错误
解决MySQL创建表时的1215外键错误
嘿,我来帮你搞定这个MySQL 1215错误的问题!这个错误说白了就是外键约束创建失败,结合你提到的documentreferences表带有两个外键,再看你贴的不完整语句,大概率是下面这些原因导致的:
- 外键与关联字段类型不匹配:一定要保证
documentreferences里的外键字段,和它关联的父表(比如patients或者其他你要关联的表)的主键/唯一键字段完全一致。比如父表主键是int(5),外键也得是int(5),哪怕是int(10)或者加了unsigned属性不一样都不行。 - 父表关联字段不是主键/唯一键:MySQL规定外键必须关联到父表的
PRIMARY KEY或者UNIQUE KEY字段,要是关联的字段只是普通字段,肯定创建不了外键约束。 - 外键字段或父表未定义:你贴的
documentreferences语句没写完,会不会是漏了外键字段的定义?比如你打算关联patients表,却没加PatientId这个字段?或者另一个要关联的表还没创建? - 引擎不支持外键:不过你已经用了
ENGINE=InnoDB,这条可以排除——毕竟只有InnoDB支持外键,MyISAM是不支持的。
给你个正确的示例参考,假设你要关联patients表和另一个自定义表,完整的documentreferences创建语句应该是这样的:
CREATE TABLE IF NOT EXISTS `documentreferences` ( `Id` int(5) NOT NULL AUTO_INCREMENT, `Status` varchar(50), `DocStatus` varchar(50), `Type` JSON, -- 单个CodeableConcept数据类型 `Class` JSON, -- 单个CodeableConcept数据类型 `Created` datetime, `Indexed` datetime, `Description` varchar(50), `SecurityLabel` JSON, -- CodeableConcept数据类型的数组 `ContextEvent` JSON, -- CodeableConcept数据类型的数组 `ContextPeriodStart` datetime, `ContextPeriodEnd` datetime, `ContextFacilityType` JSON, -- 单个CodeableConcept数据类型 `ContextPracticeSetting` JSON, -- 补全你之前未完成的字段定义 `PatientId` int(5) NOT NULL, -- 第一个外键字段,与patients.Id类型完全匹配 `RelatedTableId` int(5) NOT NULL, -- 第二个外键字段 PRIMARY KEY (`Id`), -- 创建外键约束,指定关联的表和字段,可选添加更新/删除时的行为 CONSTRAINT `fk_docref_patient` FOREIGN KEY (`PatientId`) REFERENCES `patients`(`Id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_docref_related` FOREIGN KEY (`RelatedTableId`) REFERENCES `your_related_table`(`Id`) ON DELETE SET NULL ON UPDATE SET NULL ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
最后给你几个排查小技巧:
- 先确认所有要关联的父表都已经创建完成,且它们的主键/唯一键字段和外键字段类型、属性完全一致。
- 如果外键约束要求非空,记得把外键字段设为
NOT NULL。 - 要是你已经创建了
documentreferences表再想加外键,得确保现有数据里的外键字段值都能在父表的对应字段中找到,不然也会触发1215错误。
内容的提问来源于stack exchange,提问作者Funsaized
相关产品推荐
相关产品推荐

