【问题标题】:On delete cascade, records can be deleted on the parent table, but parent table can not be dropped在删除级联时,可以删除父表上的记录,但不能删除父表
【发布时间】: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


【解决方案1】:

如果您删除表 category 但不删除/更改外键,那么它将指向任何内容。数据库内部有一个管理系统,可以加强引用约束并防止您造成损失。另请参阅thisthisthis 问题。

它也与它背后的数学有关,它被称为关系代数。我也不在那个级别,但我认为如果您删除其中一个关联表,它会破坏 FK 的定义。

在数据库关系建模和实现中,唯一键是一组零个或多个属性,其值对于关系中的每个元组(行)保证是唯一的。

【讨论】:

  • 那为什么'on delete set null'也会阻止父表被删除?这不应该使所有指向父级的记录都设置为 null 吗?这背后是否有 dbms 的一些设计决策?
  • 据我了解,FK 是在行级别实现的,但它会在表级别创建约束。
  • on delete set null - 仍然是一个 fk,它只是选择通过另一个操作来解决删除触发器 - 将依赖值设置为 NULL 而不是删除整个条目
  • 如果你删除表,它如何设置为空?更一般地说,如果您删除该表,它可能不会对父表执行任何操作。所以,你不能放弃它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多