【问题标题】:Deleting Database Rows and their References-Best Practices删除数据库行及其引用 - 最佳实践
【发布时间】:2009-12-03 18:48:39
【问题描述】:

如何删除许多其他表引用的行,无论是作为主键还是作为外键?

我是否需要以适当的顺序删除每个引用,或者是否有“自动”方式来执行此操作,例如 linq to sql?

【问题讨论】:

标签: sql-server sql-server-2008 delete-row


【解决方案1】:

如果您正在通过存储过程执行所有数据访问,那么您的主服务器删除存储过程应该负责这一点。添加新的相关表时需要对其进行维护,但 IMO 要求您考虑自己在做什么,这是一件好事。

就个人而言,我远离级联删除。当用户应该被警告现有孩子而不是被警告时,意外删除大量记录太容易了。

【讨论】:

  • +1 - 我从未在我工作过的系统中遇到过我想要级联删除的案例。我们要么没有删除东西(因为它们太重要了——例如 Patient、Patient Detail),要么是我们通常使用外键永远不会真正删除的项目,因为与它们相关联的东西太多(例如查找、代码表、等)
【解决方案2】:

很多时候,删除数据库中某些内容的最佳方法是通过设置 IsDeleted 列“虚拟”删除它,然后在所有其他查询中忽略该行。

对于高度链接的表来说,删除的代价可能非常高,而且在删除过程中,锁定可能会导致其他查询失败。

您可以将“IsDeleted”行永久保留在系统中(这可能有助于审核),或者在系统空闲时返回并真正删除它们。

【讨论】:

  • 这当然会使您的所有选择复杂化以过滤掉已删除的行。假设您的选择多于删除,我不确定您是否可以根据性能证明这一点。但是,出于审核/撤消目的,我同意这通常是需要的。
【解决方案3】:

如果您使用 ON DELETE CASCADE 设置了外键,它会使用 DELETE master WHERE id = :x 来修剪您的数据库

【讨论】:

  • 使用旧版本的 MS SQL Server 违背了“最佳实践”;)
  • @OMG,Sql 2000 包括引用键级联(即在删除/更新级联上)-也许编辑答案以删除最初存在的内容(如删除/更新集 x),即 2005仅限 +,但在 Sql 2000+ 中可以使用标准删除级联
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多