2016-07-10 12 views
1

Kann ich einen ausgewählten Knoten zusammen mit allen darunter liegenden Unterknoten vereinfachen oder verbessern?Löschen von Knoten in einer Datenbankstruktur

Tabelle sieht wie folgt aus:

CREATE TABLE cats (cat_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
        cat_pid INTEGER NOT NULL, 
        cat_name VARCHAR(40) 
       ) 

Die Abfrage:

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 

Wenn möglich, möchte ich von der loszuwerden OR in der DELETE-Anweisung, aber nicht wissen, wie.

Eigentlich, wenn Löschen mit Fremdschlüsseln/Kaskadierung gelöscht werden könnte, wäre es auch sehr interessant.

Die Datenbank ist SQLite.

+0

wie SQLite Looks unterstützt 'auf löschen cascade', wenn Sie Richten Sie 'cat_pid' richtig ein, es sollte" einfach funktionieren ": https://www.sqlite.org/foreignkeys.html#fk_actions – Blorgbeard

+0

Ich habe versucht, aber einfügen gab eine" Foreign KEY constraint failed ". cat_pid wurde so eingerichtet: cat_pid INTEGER NOT NULL REFERENZEN cats (cat_id) ON DELETE CASCADE – Rimfire

Antwort

1

Der CTE beginnt mit Katzen, deren Mutter die angegebenen ID:

WHERE cat_pid = :cat_id 

gerade beginnen, was das Katze selbst:

WHERE cat_id = :cat_id 
Verwandte Themen