1
以下のすべてのサブノードと一緒に選択したノードを削除する方法を簡素化または改善できますか?データベースツリーのノードを削除する
CREATE TABLE cats (cat_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
cat_pid INTEGER NOT NULL,
cat_name VARCHAR(40)
)
クエリ:
表は次のようになります可能であれば
WITH tree (cat_id, cat_pid, level, cat_name) AS
(
SELECT cat_id, cat_pid, 0 as level, cat_name
FROM cats
WHERE cat_pid = :cat_id --parameter from FreePascal/Lazarus
UNION ALL
SELECT cats.cat_id, cats.cat_pid, tree.level + 1, cats.cat_name
FROM cats
INNER JOIN tree ON tree.cat_id = cats.cat_pid
)
DELETE FROM cats
WHERE cat_id IN (SELECT cat_id FROM tree)
OR cat_id=:cat_id
、私はDELETE文でORを取り除くしたいと思いますが、どのように知りません。
実際には、外部キー/カスケード削除を使用して削除を実行できる場合は、非常に興味深いものになります。
データベースはSQLiteです。
、ルックス:
はちょうどその猫自身が何を始めます'cat_pid'を正しく設定してください。正しく動作するはずです。https://www.sqlite.org/foreignkeys.html#fk_actions – Blorgbeard
私は試してみましたが、挿入は「外部KEY制約に失敗しました。 cat_pidは次のように設定されました:cat_pid INTEGER NOT NULL REFERENCES cats(cat_id)ON DELETE CASCADE – Rimfire