级联在sql中是如何实现的?

Posted

技术标签:

【中文标题】级联在sql中是如何实现的?【英文标题】:how is cascading implemented in sql? 【发布时间】:2022-01-14 14:10:28 【问题描述】:

我有一个带有主键的 tableA,它充当 tableB 的外键。

假设ON DELETE CASCADE开启,如果从tableA中删除一行,sql如何从tableB中删除行。

SQL 是否对 tableB 执行全表扫描? 如果外国列被索引了怎么办?

【问题讨论】:

参与外键的列必须在两个表中都有索引,否则在尝试创建 FK 时会收到错误消息。而且,是的,mysql也没有灵丹妙药,它必须查找相关值并删除相应的行。 标签并未涵盖 MySQL 如何实现其功能。 【参考方案1】:

数据库将对 B 执行全表扫描,除非它不需要,因为该列已编入索引。这就是为什么您应该始终为您的 FK 编制索引。

编辑:我从@BillKarwin 的评论中看到,MySQL 不允许您在没有为目标列编制索引的情况下拥有 FK。 Oracle,我的专业领域,将允许它,并且会如上所述对外部表进行全面扫描以查找要删除的行,这当然非常慢。

【讨论】:

对于 MySQL,不可能不索引外键列。如果一个外键不存在,定义一个外键会自动创建一个索引。这并不总是正确的。但是曾经需要您手动为 FK 创建索引的 MySQL 版本已经停产多年。

以上是关于级联在sql中是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章

级联在保存数据时不起作用

删除级联在这种情况下不起作用[重复]

hibernate删除操作,一般如何实现

如何实现关系表的级联删除(ON DELETE CASCADE的用法)

如何实现参数级联查询

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例