首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql软删除

MySql软删除
EN

Stack Overflow用户
提问于 2012-03-28 13:59:44
回答 2查看 3.1K关注 0票数 0

我有一个现有的应用程序(使用MySQL DB)。

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

如果有更聪明的方法来处理这种情况,请告诉我。如果我引入一个新的标志来处理删除,我必须在一半的查询中进行更改。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-28 14:06:46

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

对逻辑层(表、列、行等)的

更改不能要求对基于结构的应用程序进行更改。逻辑数据独立性比物理数据独立性更难实现。

您可以rename您的表,并使用原始表名称创建视图。示例:

让我们假设一个名为my_data的表

代码语言:javascript
复制
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'

另一种方法是创建触发器,并复制独立表中已擦除的行。

票数 5
EN

Stack Overflow用户

发布于 2012-03-28 14:06:59

四点建议:

  1. 不使用名为is_deleted的位,而是使用名为deleted_Date的dateTime ...如果它仍处于活动状态,则将此值设置为NULL,否则将其设置为删除日期的时间戳。这样,您还可以知道何时更新一半的查询以排除已删除的记录,创建一个执行此筛选的视图,然后更新您的查询以使用此视图,而不是在所有地方应用筛选。
  2. 如果软删除的记录涉及任何类型的关系,您可能必须创建触发器,以确保活动记录的父级不能在您希望最终硬删除这些软删除记录的方式之前标记为deleted.
  3. Think。
  4. 并确保在执行hard-delete.

之前进行了适当的完整性检查

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9901905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档