MySql软删除

问题描述:

我有一个现有的应用程序(与MySQL数据库)。MySql软删除

我刚刚得到一个新的要求,我需要删除一些主要实体的记录。我不想在这里申请硬删除作为整个应用程序的风险。如果我使用软删除,我必须添加另一个字段is_deleted,因此我必须更新我所有的查询(如where is_deleted ='0')。

请让我知道是否有更聪明的方式来处理这种情况。如果我引入一个新的标志来处理删除,我必须对一半的查询进行更改。

+1

没有其他办法 - 无论是一个新的标志和/或可以扩展现有的标志...... – Yahia 2012-03-28 06:03:07

+0

是,按照您的要求标记是最好的选择,othervise你可以把你的表的抽象成临时表并完成删除它的检查。 – 2012-03-28 06:04:54

+0

取决于软删除的含义以及应用程序的风险。您可以为“已删除”条目创建一个新表,并将“软删除”移到整个表中。 – liquorvicar 2012-03-28 06:05:47

您的应用程序无需任何更改即可运行。 MySQL是ANSI-SPARC Architecture兼容。随着外部模式您实现codd's rule 9 "Logical data independence"

变化到逻辑电平(表,列,行等)必须 不需要改变结构的基础上的应用程序。逻辑 数据独立性比物理数据难以实现独立性。

您可以rename您的表,并创建与原始表名称的意见。样本:

让我们supose一个名为my_data表:

REMAME TABLE my_data TO my_data_flagged 

ALTER TABLE my_data_flagged 
    ADD COLUMN is_deleted boolean NOT NULL default 0; 

CREATE VIEW my_data AS 
    SELECT * 
    FROM my_data_flagged 
    WHERE is_deleted = '0' 

另一种方法是创建一个触发器,使删除行的副本中的独立表。

四点建议:

  1. 而不是使用一个名为位的is_deleted,使用日期时间称为像deleted_Date ...这个值是NULL,如果它仍处于活动状态,并且是删除时间戳否则日期。这种方式你也知道一个特定的记录被删除。

  2. 而不是更新一半的查询来排除已删除的记录,创建一个视图来执行此筛选,然后更新您的查询以使用此视图而不是在任何地方应用筛选。

  3. 如果软删除的记录涉及任何类型的关系,则可能必须创建触发器以确保活动记录不能有被标记为已删除的父项。

  4. 请考虑您希望如何最终硬删除这些软删除的记录,并确保在执行硬删除之前进行适当的完整性检查。