Sqlite 数据库软删除的实现
我有一个SQLite数据库,我正在转向软删除方法,即:Sqlite 数据库软删除的实现,sqlite,filter,sql-delete,Sqlite,Filter,Sql Delete,我有一个SQLite数据库,我正在转向软删除方法,即: 在每个表中添加一个delete字段。此字段可以设置为0(未删除)或1(已删除) 将每个DELETE查询转换为UPDATE查询,将DELETE标志设置为1 通过添加和delete=0条件来修改每个选择查询,以仅拾取未删除的记录 新的数据库架构 这里是卡表: +------------+---------+-----------+ | id | name | deleted | +------------+----
- 在每个表中添加一个
字段。此字段可以设置为0(未删除)或1(已删除)delete
- 将每个
查询转换为DELETE
查询,将DELETE标志设置为1UPDATE
- 通过添加
条件来修改每个和delete=0
查询,以仅拾取未删除的记录选择
卡
表:
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
+------------+---------+-----------+
| cardid | tagid | deleted |
+------------+---------+-----------+
这里是标签
表:
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
+------------+---------+-----------+
| cardid | tagid | deleted |
+------------+---------+-----------+
这里是cardtag
表:
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
+------------+---------+-----------+
| id | name | deleted |
+------------+---------+-----------+
+------------+---------+-----------+
| cardid | tagid | deleted |
+------------+---------+-----------+
cardtag.cardd
和cardtag.tagid
分别是card.id
和tag.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;
应修改此查询,以了解标记
和卡片标记
表上的已删除
标志,并采取相应措施
查询以通过提供[逗号分隔的标签ID列表]检索所有卡片和相关标签列表。
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
应修改此查询,以了解标记
和卡片标记
表上的已删除
标志,并采取相应措施
最后一个查询通过查看提供的标记ID列表来工作,并选择所有与这些标记关联的卡(当然,它们甚至可能有其他标记)。换言之:查询选择至少具有输入中提供的所有标记ID的所有卡您可以在
加入部分中使用和
第一个问题
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;
第二个问题
SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid AND ct.deleted != 1 LEFT JOIN tags as t ON t.id = ct.tagid AND t.deleted != 1 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
您可以在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;
第二个问题
SELECT c.*, GROUP_CONCAT(ct.tagid) FROM cards as c LEFT JOIN cardtag as ct ON c.id = ct.cardid AND ct.deleted != 1 LEFT JOIN tags as t ON t.id = ct.tagid AND t.deleted != 1 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
在查询中处理此问题的最简单方法是根本不更改查询,而是创建使表看起来像以前一样的查询:
CREATE VIEW card_view AS SELECT id, name FROM card_actual WHERE deleted = 0;
(也可以在视图上创建。)在查询中处理此问题的最简单方法是根本不更改查询,而是创建使表看起来像以前的表:
CREATE VIEW card_view AS SELECT id, name FROM card_actual WHERE deleted = 0;
(也可以在视图上创建。)谢谢。我的直觉告诉我,我还必须考虑标记表中的deleted标志。为什么根本不需要这样的旗帜?我的意思是,如果设置了这样的标志,那么标签就被删除了altogether@GianlucaGhettini我写的只是一个你可以使用的例子。在另一个连接上使用相同的技巧完全没有问题。是的,谢谢,但我不熟悉left-join和on语句,因此我不清楚在哪里放置这些额外条件。。你能告诉我怎么做吗?@GianlucaGhettini更新了查询。谢谢!向上投票!第一个呢?我会接受答案的,谢谢。我的直觉告诉我,我还必须考虑标记表中的deleted标志。为什么根本不需要这样的旗帜?我的意思是,如果设置了这样的标志,那么标签就被删除了altogether@GianlucaGhettini我写的只是一个你可以使用的例子。在另一个连接上使用相同的技巧完全没有问题。是的,谢谢,但我不熟悉left-join和on语句,因此我不清楚在哪里放置这些额外条件。。你能告诉我怎么做吗?@GianlucaGhettini更新了查询。谢谢!向上投票!第一个呢?我会接受这个答案我喜欢观察法但我想避免它我喜欢观察法但我想避免它