Mysql 如何从数据库中删除?

Mysql 如何从数据库中删除?,mysql,database-design,sql-delete,Mysql,Database Design,Sql Delete,我知道从数据库表中删除数据的两种方法 永远删除它 使用类似isActive/isDeleted的标志 现在,isActive的问题是,我必须在SQL查询中的任何地方跟踪记录是否处于活动状态。然而,使用DELETE将永远删除数据 备份此数据的最佳方法是什么 假设我在一个数据库中有多个表,我应该有一个公共函数来备份所有内容并将其存储在另一个表中(可能是XML格式的),还是有其他方法 我正在使用MySQL,但对其他数据库中使用的技术也很好奇。用隐藏非活动项的视图替换表 或者在删除时写入一个触发器,

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

  • 永远删除它
  • 使用类似isActive/isDeleted的标志
现在,isActive的问题是,我必须在SQL查询中的任何地方跟踪记录是否处于活动状态。然而,使用DELETE将永远删除数据

备份此数据的最佳方法是什么

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


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

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


或者在删除时写入一个触发器,将行备份到存档表。

您可以在
已删除
列上对表进行分区,并定义包含以下条件的视图:

… AND deleted = 0

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

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

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

您可以使用isDeleted列并定义一个视图,该视图选择除isDeleted外的所有列,条件为isDeleted=false。然后让所有STP仅与视图一起工作。

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

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


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

abhinav想要删除行。。。分区和使用视图(在
sqlserver
Oracle
中)将使查询的行为与从表中物理删除行的行为完全相同。要处理被删除(或聚合)的数据,您可以直接针对表编写不那么简单的查询。如果您告诉我们您使用的是什么DB软件,人们可能会很乐意为您提供代码片段:)使用MySQL。其他人不是吗PSQL服务器不是唯一一个具有触发器功能的数据库,但它有助于了解Abhinav是否使用支持触发器的RDBMS。我能想到的其他版本有MySQL、Oracle、Progress OpenEdge,可能还有其他版本。如果该版本有触发器,那么应该有。很抱歉,我使用Sql Server,所以我不确定您使用的版本。触发器仅在MySQL 5+中可用。