能否有人向我展示或描述如何实现软删除?
我有这些字段的凭证表:id、username、password、serial。
我希望根据客户的请求显示给定数量的行,一旦显示,它们就应该被删除,这样就不会再次显示。(它们已经无效了。)
我认为软删除将确保不会显示两次凭单。如果你对我怎么做有任何其他的想法,我会很感激的。
发布于 2013-03-13 11:14:40
我一直通过在表中增加两个列来实现软删除,一个列用于状态,另一个列用于删除日期。
我的表结构将类似于以下内容:
create table myTable
(
id int,
name varchar(50),
IsDeleted bit,
DeletedDate datetime
);IsDeleted列的默认值为no,在实际标记为已删除的行之前,不会填充DeletedDate。当我想知道一行何时被软删除时,我会在其中包含一个日期列。
然后,当您查询数据时,您将在WHERE子句中包括该列:
select id, name
from myTable
where IsDeleted = 0注意:您将希望在IsDeleted列中包含一个索引。
发布于 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
发布于 2022-05-02 14:26:55
我不建议使用is_deleted或deleted_at标志,当表有唯一索引时,它们不工作。
我的解决方案是使用version列和快照(归档)表,version列也可以用来避免并发更新(获取更新问题/乐观锁)。
快照(归档)表与源表具有相同的架构,但只有id + version索引。
当更新源表中的行时,增加version字段,例如:update example set version=1 where id=1 and version=0。如果要保存所有历史记录,也可以在更新前将行复制(重新插入)到快照表,
当删除源表中的行时,将该行复制(向上插入)到快照表,然后在源表中删除,在一个事务中执行这两个步骤。
由于所有快照表都有id和version列,所以我还实现了一般快照逻辑,如果使用ORM库自动生成sql迁移,则会更简单。
https://dba.stackexchange.com/questions/36558
复制相似问题