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的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Error 1215创建外键

一般错误:1215 无法添加外键约束,Laravel 5 & MySQL

mysql外键添加error1215

MySQL 错误 [1215] [HY000] - 无法添加外键 [重复]

使用 mysql 工作台创建 CHAR 类型的外键时出错:错误 1005:无法创建表(错误号:150)

MySQL 错误 1215:无法添加外键约束