MySQL 使用外键创建模式抛出错误 1215
Posted
技术标签:
【中文标题】MySQL 使用外键创建模式抛出错误 1215【英文标题】:MySQL Create Schema with foreign keys throws error 1215 【发布时间】:2018-09-02 05:14:12 【问题描述】:我在 mysql 中创建了以下 3 个表的基本架构,其中一个有两个外键(documentreference 表):
-- Dumping database structure
CREATE DATABASE IF NOT EXISTS `zeus`;
USE `zeus`;
-- ****** FHIR RESOURCES ******
CREATE TABLE IF NOT EXISTS `patients`
(
`Id` int(5) NOT NULL AUTO_INCREMENT,
`Active` bool,
`Name` JSON, -- JSON blob array of HumanName DataTypes
`Telecom` JSON, -- JSON blob array of ContactPoint DataTypes
`Gender` varchar(10),
`BirthDate` datetime,
`DeceasedBoolean` bool,
`DeceasedDateTime` datetime,
`Address` JSON, -- JSON array of Address DataTypes
`MaritalStatus` JSON, -- JSON blob single CodeableConcept DataType
`MultipleBirthBoolean` bool,
`MultipleBirthInteger` int(5),
`Communication` JSON, -- JSON array of languages & preferred bool i.e "[language: CodeableConcept(English), preferred: true, ...]"
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `documentreferences`
(
`Id` int(5) NOT NULL AUTO_INCREMENT,
`Status` varchar(50),
`DocStatus` varchar(50),
`Type` JSON, -- single CodeableConcept DataType
`Class` JSON, -- single CodeableConcept DataType
`Created` datetime,
`Indexed` datetime,
`Description` varchar(50),
`SecurityLabel` JSON, -- array of CodeableConcept DataTypes
`ContextEvent` JSON, -- array of CodeableConcept DataTypes
`ContextPeriodStart` datetime,
`ContextPeriodEnd` datetime,
`ContextFacilityType` JSON, -- single CodeableConcept DataType
`ContextPracticeSetting` JSON, -- single CodeableConcept DataType
PRIMARY KEY (`id`),
`SubjectId` int(5),
INDEX subject_ind (SubjectId),
FOREIGN KEY (SubjectId)
REFERENCES patients(Id)
ON DELETE CASCADE,
-- ** FK below causes issue **
`PractitionerId` int(5),
INDEX practitioner_ind (PractitionerId),
FOREIGN KEY (PractitionerId)
REFERENCES practitioners(Id)
ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `practitioners`
(
`Id` int(5) NOT NULL AUTO_INCREMENT,
`Active` bool,
`Name` JSON, -- JSON blob array of HumanName DataTypes
`Telecom` JSON, -- JSON array of ContactPoint DataTypes
`Address` JSON, -- JSON array of Address DataTypes
`Gender` varchar(10),
`BirthDate` datetime,
`Qualification` JSON,
`Communication` JSON, -- JSON array of CodeableConcept DataTypes
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
但是运行时出现以下错误:
错误 1215:无法添加外键约束 SQL 语句: 如果不存在则创建表
documentreferences
(Id
int(5) NOT NULL AUTO_INCREMENT,Status
varchar(50),DocStatus
varchar(50),@987654326 @ 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, -- 单个 CodeableConcept 数据类型 主键 (id
),SubjectId
int(5), INDEX subject_ind (SubjectId), 外键(SubjectId) 参考 患者(Id) 关于删除级联, -- ** 下面的 FK 导致问题 **PractitionerId
int(5), INDEX 从业者_ind (PractitionerId), 外键 (PractitionerId) 参考从业者(Id) 删除级联 ) ENGINE=InnoDB AUTO_INCREMENT=10 默认字符集=latin1
删除从业者表上的 FK 时,架构会运行。我当前的架构有什么问题会导致错误?任何见解表示赞赏
【问题讨论】:
FOREIGN KEY (PractitionerId) REFERENCES practitioners(Id) ON DELETE CASCADE
FOREIGN KEY (PractitionerId)
在您的文档引用表中没有看到 PractitionerId 列?
PractitionerId 列是在此处的文档引用表中定义的吧? : -- ** FK 下面导致问题 ** PractitionerId
int(5), INDEX practice_ind (PractitionerId), FOREIGN KEY (PractitionerId) REFERENCES practices(Id) ON DELETE CASCADE
对,我现在看到了,我期待的是其他列之间的列而不是索引之间的列
尝试使用 FOREIGN KEY 再次创建表并使用SHOW ENGINE INNODB STATUS
,因为它可能会为我们提供更好的错误消息。
问题是我在作为外键引用的表下方创建了从业者表。感谢您的帮助!
【参考方案1】:
SQL 喜欢让事情井井有条。您需要在将所有表与外键关系链接之前声明它们。只需将创建的从业者表移到 documentreferences 表上方即可。
【讨论】:
恭喜你的第一个答案!以上是关于MySQL 使用外键创建模式抛出错误 1215的主要内容,如果未能解决你的问题,请参考以下文章
一般错误:1215 无法添加外键约束,Laravel 5 & MySQL
MySQL 错误 [1215] [HY000] - 无法添加外键 [重复]