删除许多带有子表的记录

Posted

技术标签:

【中文标题】删除许多带有子表的记录【英文标题】:Deleting many records with child tables 【发布时间】:2009-01-30 14:12:15 【问题描述】:

情况:

表 TBL 有大约 10k 项要删除, 表 TBL 有 14 个子表,删除规则为“无操作”, 我想删除子表中的 10k 个条目和引用的条目。

程序:

删除子表中的记录, 禁用约束(如果未禁用约束,则在下一步中删除需要永远), 删除TBL表中的记录, 启用约束。

有没有更优雅的方法来做到这一点?

问题是第三步耗时太长,因为它正在检查 14 个大表是否存在不存在的记录。我的程序有很好的执行时间,但我认为有更优雅的方式。

【问题讨论】:

需要在子表中索引FK列。你正在做 14 个 FTS。那=慢。 14 次索引查找 = 快速。 【参考方案1】:

听起来您需要在子表上索引外键。每次删除子表上没有索引的父记录时,它必须对子表进行全表扫描以检查外键约束是否被破坏。

对于索引,最坏的情况是索引范围扫描。

编辑: 可以在此处找到更多信息以及确定这是否是您的问题的脚本。 http://asktom.oracle.com/tkyte/unindex/index.html

【讨论】:

这是一个很好的提示和 AskTom 链接(我投了赞成票),但是子表在这个 FK 上被索引。 我对您的方法的主要担忧是,如果另一个会话在约束关闭时将错误数据插入到子表中。如果那是不可能的,那么你应该没问题。

以上是关于删除许多带有子表的记录的主要内容,如果未能解决你的问题,请参考以下文章

判断子表外键约束参数类型

SQL 如何把两个表相关联的数据一同删除

基于条件比较两个子表的聚合返回记录

Oracle Delete inner的方式,级联删除子表的数据方式。

ACCESS级联删除一对多关系的记录

关于mysql的级联删除(之前好多人咨询过我)