【问题标题】:How to delete from a database?如何从数据库中删除?
【发布时间】:2009-11-23 17:47:32
【问题描述】:

我知道从数据库表中删除数据的两种方法

  • 永远删除它
  • 使用像 isActive/isDeleted 这样的标志

现在 isActive 的问题是我必须在我的 SQL 查询中跟踪记录是否处于活动状态。但是,使用 DELETE 会永远删除数据。

备份这些数据的最佳方法是什么?

假设我在数据库中有多个表,我是否应该有一个通用函数来备份所有内容并将其存储在另一个表中(可能是 XML 格式?)还是有其他方法。

我正在使用 MySQL,但也对其他数据库中使用的技术感到好奇。

【问题讨论】:

  • 如果你告诉我们你正在使用什么数据库软件,人们可能会很乐意给你代码 sn-ps :)
  • 使用 MySQL。不是其他人吗? :P

标签: mysql database-design sql-delete


【解决方案1】:

用隐藏非活动项目的视图替换表格。

或者在 DELETE 上编写一个触发器,将行备份到存档表。

【讨论】:

    【解决方案2】:

    您可以使用在删除记录时触发的触发器将它们备份到某种墓地表中。

    【讨论】:

      【解决方案3】:

      您可以使用 isDeleted 列并定义一个视图,该视图选择除 isDeleted 之外的所有列,条件为 isDeleted=false。然后让您的所有 stps 仅适用于视图。

      【讨论】:

        【解决方案4】:

        您可以维护一个历史表,在其中备份记录和时间戳

        【讨论】:

          【解决方案5】:

          不删除数据的最大原因之一是关系可能需要它 - 例如,用户可能决定从数据库中删除旧客户,但您仍然需要客户记录,因为它被旧发票引用(可能有更长的生命周期)。

          基于此,最好的解决方案通常是“IsDeleted”类型的列,结合视图(Quassnoi 提到了分区,它可以帮助解决由于大量不可见数据而可能出现的性能问题)。

          【讨论】:

            【解决方案6】:

            您可以在 DELETED 列上对表进行分区并定义包含条件的视图:

            … AND deleted = 0
            

            这将使对活动数据的查询同样简单高效。

            【讨论】:

            • abhinav 想要删除行...所以需要水平分区。
            • 分区和使用视图(在SQL Server 和Oracle 中)将使查询的行为与从表中物理删除行完全一样。要处理已删除(或聚合)的数据,您始终可以直接针对表编写不太简单的查询。
            【解决方案7】:

            好吧,如果您使用的是 SqlServer,您可以使用触发器,这将允许您将记录移动到已删除的表中。

            【讨论】:

            • SQL Server 不是唯一具有触发器功能的数据库,但了解 Abhinav 是否使用支持触发器的 RDBMS 会有所帮助。我能想到的还有 MySQL、Oracle、Progress OpenEdge,可能还有其他。
            • 如果那个版本有触发器,那么是的,它应该。对不起,我使用的是Sql Server,所以我不确定你使用的版本。
            • 触发器仅在 MySQL 5+ 中可用。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多