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

实现软删除
EN

Database Administration用户
提问于 2013-03-13 10:57:51
回答 3查看 12.7K关注 0票数 7

能否有人向我展示或描述如何实现软删除?

我有这些字段的凭证表:idusernamepasswordserial

我希望根据客户的请求显示给定数量的行,一旦显示,它们就应该被删除,这样就不会再次显示。(它们已经无效了。)

我认为软删除将确保不会显示两次凭单。如果你对我怎么做有任何其他的想法,我会很感激的。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2013-03-13 11:14:40

我一直通过在表中增加两个列来实现软删除,一个列用于状态,另一个列用于删除日期。

我的表结构将类似于以下内容:

代码语言:javascript
复制
create table myTable
(
  id int,
  name varchar(50),
  IsDeleted bit,
  DeletedDate datetime
);

IsDeleted列的默认值为no,在实际标记为已删除的行之前,不会填充DeletedDate。当我想知道一行何时被软删除时,我会在其中包含一个日期列。

然后,当您查询数据时,您将在WHERE子句中包括该列:

代码语言:javascript
复制
select id, name
from myTable
where IsDeleted = 0

注意:您将希望在IsDeleted列中包含一个索引。

票数 11
EN

Database Administration用户

发布于 2013-03-13 12:50:05

“蓝脚鸟”给出的答案足以帮助你。

软删除的是常见的做法.Please看看一些urls,这将建议您的利弊软删除和其他一些伟大的信息。

https://stackoverflow.com/questions/2549839/are-soft-deletes-a-good-idea

https://stackoverflow.com/questions/378331/physical-or-logical-delete-of-database-record

票数 2
EN

Database Administration用户

发布于 2022-05-02 14:26:55

我不建议使用is_deleteddeleted_at标志,当表有唯一索引时,它们不工作。

我的解决方案是使用version列和快照(归档)表,version列也可以用来避免并发更新(获取更新问题/乐观锁)。

快照(归档)表与源表具有相同的架构,但只有id + version索引。

当更新源表中的行时,增加version字段,例如:update example set version=1 where id=1 and version=0。如果要保存所有历史记录,也可以在更新前将行复制(重新插入)到快照表,

当删除源表中的行时,将该行复制(向上插入)到快照表,然后在源表中删除,在一个事务中执行这两个步骤。

由于所有快照表都有id和version列,所以我还实现了一般快照逻辑,如果使用ORM库自动生成sql迁移,则会更简单。

参考资料:https://medium.com/geekculture/soft-deletes-are-tedious-does-an-ideal-deletion-without-loss-even-exist-9cc5d78e9b10

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

https://dba.stackexchange.com/questions/36558

复制
相关文章

相似问题

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