级联在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也没有灵丹妙药,它必须查找相关值并删除相应的行。数据库将对 B 执行全表扫描,除非它不需要,因为该列已编入索引。这就是为什么您应该始终为您的 FK 编制索引。
编辑:我从@BillKarwin 的评论中看到,MySQL 不允许您在没有为目标列编制索引的情况下拥有 FK。 Oracle,我的专业领域,将允许它,并且会如上所述对外部表进行全面扫描以查找要删除的行,这当然非常慢。
【讨论】:
对于 MySQL,不可能不索引外键列。如果一个外键不存在,定义一个外键会自动创建一个索引。这并不总是正确的。但是曾经需要您手动为 FK 创建索引的 MySQL 版本已经停产多年。以上是关于级联在sql中是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章