在删除级联上,可以在父表上删除记录,但不能删除父表

时间:2016-08-10 06:58:48

标签: mysql

我有两张桌子

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删除类别表中的行,则itemal表中categoryid为2的记录也会被删除。由于删除级联,这是预期的。但是,如果我尝试删除表类别,我会收到错误错误代码:

1217. Cannot delete or update a parent row: a foreign key constraint fails

为什么会这样?当然,设置foreign_key_checks = 0可以丢弃表。但我想知道为什么会发生这种情况我们可以删除记录,但不能删除表上的cascade删除选项。此选项仅适用于删除记录,但不适用于删除表。

我检查了文档,我找不到任何解释。

如果我遗漏了某些基本内容,或者如果您指出相关文档,那么请告诉我它会有所帮助。我正在使用MySQL 5.7。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果删除表category但不删除/更改外键,那么它将不指向任何内容。在内部,数据库有一个管理系统,可以强化参照约束并防止您创建丢失的端点。另请参阅thisthisthis个问题。

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

  

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