我有兩個表,“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'));
上述設定允許設定 mot 的“鏈”,未來能夠為每個 mot 擁有多個可能的后續 mot。因此,例如,我可以:
表:mots
| mot_id |
| :----- |
| MOT_1 |
| MOT_2 |
| MOT_3 |
表: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 中它是父級的所有行,同時標記所有 follower_id,然后遍歷所有 follower_id,注意他們的所有關注者,然后刪??除他們是父級的所有行,然后重復這個。但是,這似乎非常耗費資源,因為我必須進行大量資料庫呼叫。
有什么方法可以將這個洗掉鏈組合到一個資料庫呼叫中?
uj5u.com熱心網友回復:
宣告外鍵的級聯洗掉:
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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/467187.html
標籤:sqlite
