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;
我有 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;