SQLite 链从 table 中删除

SQLite chain delete from table

我有 2 个 table、'mots' 和 'mots_followers_bridge'。在 mots 中有一个相关行称为 'mot_id',在 mots_followers_bridge、'parent_id' 和 'follower_id 中有两行。这些可以设置如下:

CREATE TABLE 'mots' (mot_id TEXT NOT NULL, PRIMARY KEY('mot_id'));

CREATE TABLE 'mots_followers_bridge' (
  parent_id TEXT NOT NULL, 
  follower_id TEXT NOT NULL,
  FOREIGN KEY('parent_id') REFERENCES 'mots'('mot_id'),
  FOREIGN KEY('follower_id') REFERENCES 'mots('mot_id'),
  PRIMARY KEY('parent_id', 'follower_id')); 

以上设置允许设置 'chains' 个 mots,未来可以为每个 mot 设置多个可能的后续 mots。因此,例如,我可以:

table: mots

| mot_id |
| :----- |
| MOT_1  |
| MOT_2  |
| MOT_3  |

table:mots_followers_bridge:

| parent_id | follower_id |
| :-------- | :---------- |
| MOT_1     | MOT_2       |
| MOT_2     | MOT_3       |

我的问题是关于何时需要删除 MOT_1。如果我想删除链中的所有 mots,即删除 MOT_2 和 MOT_3,有什么方法可以做到这一点?

当然我可以创建一个循环,从 MOT_1 开始,删除 mots_followers_bridge 中属于 parent 的所有行,同时标记所有 follower_id然后遍历所有 follower_id,注意他们的所有关注者,然后删​​除他们所在的所有行 parent,然后重复此操作。但是,这似乎非常耗费资源,因为我必须进行大量的数据库调用。

有什么方法可以将这个删除链合并到一个数据库调用中吗?

声明外键级联删除:

  FOREIGN KEY('parent_id') REFERENCES mots('mot_id') ON DELETE CASCADE,
  FOREIGN KEY('follower_id') REFERENCES mots('mot_id') ON DELETE CASCADE,

打开外键:

PRAGMA FOREIGN_KEYS = ON;

使用递归 CTE 删除链:

WITH RECURSIVE del(n) AS (
    SELECT 'MOT1'
    UNION
    SELECT follower_id FROM mots_followers_bridge AS mfb
                       JOIN del ON del.n = mfb.parent_id
) DELETE FROM mots WHERE mot_id IN del;