gpt4 book ai didi

sql - 有外键关系的数据如何在SQL中实现软删除?

转载 作者:搜寻专家 更新时间:2023-10-30 20:16:18 27 4
gpt4 key购买 nike

我需要在具有 5 个子外键关系的表上的 Web 应用程序上更改“删除”功能的行为。这是一个相当大的 Web 应用程序,因此我正在寻找风险最小和影响最小的更改,以便它需要对 Web 应用程序进行最少的更改。

我可以想到两种选择:

  1. 在表中添加一列deleted,默认为01表示该记录已被删除。这将需要更新表上的所有选择(以及它的子表,因为它们现在是孤立的)以包含子句 where deleted = 0。 Web 应用程序很旧且编写得不好(重复代码),因此有很多地方需要进行此更改,因此存在遗漏一个或多个位置的风险。

  2. 将记录移动到表的另一个副本,专门针对已删除的记录。我可能还需要镜像每个子表。

选项 1 似乎在前期更费力,但在未来更易于维护,选项 2 前期工作量不大,对 web 应用程序的更改很少,但非常困惑。还有其他选择吗?

最佳答案

这是一个很好的例子,说明了为什么我如此喜欢 View 。

  • 创建新列,已删除
  • 重命名表:MyData => AllMyData
  • 使用旧名称创建一个 View ,以完全按照以前的方式显示表中的数据,但仅限于“未删除”的行。

例子:

create view MyData as
select ...
from AllMyData
where Deleted = 0
  • 在 View 上编写触发器来处理 DML,就好像它是原始表一样。

  • 创建另一个 View 以显示已删除的行。

例子:

create view DeletedMyData as
select ...
from AllMyData
where Deleted = 1
  • 在应用程序中实现“软删除”和“取消删除”功能。此代码将是唯一直接访问表的代码,并根据需要将 Deleted 的值设置为 0 或 1。 现有代码无需修改。

  • 子表可能根本不需要更改。由于它们很可能是通过与未删除的 View (具有原始表名的 View )连接来查询的,因此引用“已删除”数据的记录将不会公开,但会在数据被取消删除时自动重新公开。

    <
  • 更新:MyData 上的 ON_DELETE 触发器view 只会对实际表发出更新,将 Deleted 值设置为 1。可以使用 DeletedMyData 上的 ON_DELETE 触发器实现 UNDELETE 操作。查看以将值设置为 0。因此在 MyData 上发出删除 View 将执行软删除(记录将从 MyData 数据集中消失并出现在 DeletedMyData 中)并在 DeletedMyData 上发出删除 View 将执行软取消删除(记录将从 DeletedMyData 数据集中消失并重新出现在 MyData 中)。

关于sql - 有外键关系的数据如何在SQL中实现软删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38354430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com