2009-11-23 241 views
6

我知道有两种方法可以从数据库中删除表中的数据如何从数据库中删除?

  • 删除它永远
  • 使用标志像isActive /请将isDeleted

现在用isActive的问题是,我必须跟踪无论在我的SQL查询中,无论记录是否处于活动状态。然而,使用DELETE将永远摆脱数据。

什么是最好的备份方式?

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

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

+2

如果您告诉我们您正在使用的数据库软件,则可能会给您提供代码片段:) – tloach 2009-11-23 17:54:11

+0

使用MySQL。不是其他人吗? :P – Abhinav 2009-11-23 18:07:42

回答

13

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

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

0

您可以在DELETED列分区表和定义将包括病情的看法:

… AND deleted = 0 

这将使查询在活动数据一样简单和高效。

+0

abhinav想要删除行......所以需要进行水平分区。 – reinierpost 2009-11-23 17:51:48

+0

分区和使用视图(在'SQL Server'和'Oracle'中)将使查询完全像从表中物理删除行一样。要处理删除的(或汇总的)数据,您可以始终直接对表进行较简单的查询。 – Quassnoi 2009-11-23 17:54:14

2

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

0

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

+1

SQL Server不是唯一具有触发器功能的数据库,但它有助于了解Abhinav是否正在使用支持触发器的RDBMS。其他我可以想到的是MySQL,Oracle,Progress OpenEdge,或许还有其他的。 – ssakl 2009-11-23 18:08:55

+0

我有MySQL 4.1.25。这会在那里工作吗? – Abhinav 2009-11-23 18:27:27

+0

如果该版本有触发器,那么是的,它应该。对不起,我使用Sql Server,所以我不确定你使用的版本。 – 2009-11-23 18:29:21

2

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

1

你可以保持一个历史表,在那里你回记录了和时间戳

1

一对删除数据是,它可能需要一个关系的最大原因 - 例如用户可能会决定从数据库中删除一位老客户,但您仍然需要客户记录,因为它是由旧发票引用的(这可能会延长使用寿命)。

在此基础上最佳的解决方案往往是“请将isDeleted”类型的列,以期联合(Quassnoi提到分区,可与性能问题的帮助,可能弹出由于很多无形的数据)。