【发布时间】:2016-12-16 10:02:48
【问题描述】:
我有两张桌子
CREATE TABLE `category` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `item` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
categoryid` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`), KEY `fk_categoryid_item` (`categoryid`),
CONSTRAINT `fk_categoryid_item` FOREIGN KEY (`categoryid`)
REFERENCES `category` (`id`) ON DELETE CASCADE)
ENGINE=InnoDB DEFAULT CHARSET=utf8
在表格类别中,我有一条 id 为 2 的记录。 在项目中,我有一条 id = 1、categoryid = 2 的记录,其中 2 作为引用类别表的外键。如果我删除类别表中 id 为 2 的行,项目表中类别 ID 为 2 的记录也将被删除。由于删除级联,这正如预期的那样。但是如果我尝试删除表格类别,我会收到错误错误代码:
1217. Cannot delete or update a parent row: a foreign key constraint fails
为什么会这样?当然,设置 foreign_key_checks = 0 删除表成为可能。但是我想知道为什么会发生这种情况,我们可以删除记录,但不能使用级联删除选项删除表。这个选项是否只适用于删除记录,而不适用于删除表。
我查看了文档,找不到任何解释。
如果我遗漏了一些基本的东西,或者如果您指出相关文档会有所帮助,请告诉我。我正在使用 MySQL 5.7。
提前致谢。
【问题讨论】:
-
一个逻辑解释可能是,如果您删除父表,您将无法再插入/更新子表中的任何行,因为当您插入或更新记录时,它必须检查FK 约束
-
你缺少一些基本的东西。 MySQL 是一个关系数据库。外键用于建立关系。如果您删除依赖于关系的片段,则关系将被破坏,您设置该关系以确保数据完整性。删除与您相关的表会违反完整性,因此您会收到错误消息。这是正常的。没有记录不等于没有表。
标签: mysql