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

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

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

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

【问题讨论】:

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

标签: mysql foreign-keys cascading-deletes


【解决方案1】:

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

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

【讨论】:

  • 对于 MySQL,不可能不索引外键列。如果一个外键不存在,定义一个外键会自动创建一个索引。这并不总是正确的。但是曾经需要您手动为 FK 创建索引的 MySQL 版本已经停产多年。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
相关资源
最近更新 更多