在数据库上实现软删除

时间:2017-09-22 10:13:50

标签: sqlite filter sql-delete

我有一个SQLite数据库,我正在采用软删除方法:

  • 为每个表添加delete字段。该字段可以设置为0(未删除)或1(删除)
  • 将每个DELETE查询转换为UPDATE个查询,将删除标记设置为1
  • 修改每个SELECT查询,方法是添加AND delete = 0条件以仅提取未删除的记录

新数据库架构

这里是card表:

+------------+---------+-----------+
| id         | name    | deleted   |
+------------+---------+-----------+

这里是tag表:

+------------+---------+-----------+
| id         | name    | deleted   |
+------------+---------+-----------+

这里是cardtag表:

+------------+---------+-----------+
| cardid     | tagid   | deleted   |
+------------+---------+-----------+

cardtag.cardidcardtag.tagid分别是card.idtag.id

的外键

正如您所看到的,cardtag是将多个标签分配给卡片的经典关系表

查询我仍然需要修改

我设法将几乎所有查询移植到软删除方法(非常简单),除了以下内容:

查询以card.id

检索卡片和相关的代码列表
SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid WHERE c.id = ? GROUP BY c.id;

应修改此查询,以便了解deletedtag表格上的cardtag标记并采取相应措施

通过提供[list_of_comma_separated_tag_ids]

来查询检索所有卡片和相关的标签列表
SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid LEFT JOIN tags as t ON t.id = ct.tagid AND t.id IN ([list_of_comma_separated_tag_ids]) GROUP BY c.id HAVING COUNT(ct.tagid) >= COUNT(t.id) AND COUNT(t.id) = [list_of_comma_separated_tag_ids.length] AND c.deleted = 0

应修改此查询,以便了解deletedtag表格上的cardtag标记并采取相应措施

最后一个查询的工作原理是查看提供的标签ID列表,并选择所有具有与之关联的标签的卡(当然,它们甚至可能有其他标签)。换句话说:查询选择所有至少具有输入

中提供的所有标记ID的卡片

2 个答案:

答案 0 :(得分:1)

您可以在1部分

中使用AND

第一次查询

JOIN

第二次查询

SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid AND ct.deleted != 1 WHERE c.id = ? GROUP BY c.id;

答案 1 :(得分:1)

在查询中处理此问题的最简单方法是根本不更改查询,并创建使表格看起来像以前一样的views

CREATE VIEW card_view AS SELECT id, name FROM card_actual WHERE deleted = 0;

(也可以在视图上创建INSTEAD OF DELETE triggers。)