Delete cascade?

Hallo Forum,

gibt es eine Möglichkeit, beim Löschen von Datensätzen einen bestehenden Fremdschlüssel-Constraint zu ignorieren, der auf den zu löschenden Datensatz verweist? Oder kann man temporär die FK-Constraints deaktivieren?

Im Grunde kann ich mir die Frage selbst mit Nein beantworten, denn das Löschen eines referenzierten Datensatzes würde die Tabelle des referenzierenden Datensatzes in einen inkonsistenten Zustand bringen.

Ich habe hier sehr komplexe Tabellenstrukturen, die untereinander allermeistens FK-Constraints der Art “ON DELETE RESTRICT” besitzen, um die referentielle Integrität zu wahren. FK-Constraints werden ja nicht bei 1:1 Beziehungen (wo die Speicherung idR in derselben Tabelle stattfindet), sondern vornehmlich bei 1:n und m:n Beziehungen eingesetzt.

Bei 1:n Beziehungen ist das Löschen kein Problem, weil die Referenzierungen kettenartig verlaufen und man ohne Zwischenspeichern von irgendwelchen Primärschlüsseln allein mit SQL-Statements (unter Verwendung von DELETE FROM … USING … WHERE) diese Ketten invers-rekursiv löschen kann.

Bei m:n Beziehungen ist das erheblich aufwendiger: Zunächst muß der Datensatz der Beziehungstabelle (der die referenzierten PK’s jeweils mit FK-Constraints enthält) gelöscht werden. Dabei müssen die referenzierten PK’s zwischengespeichert werden, um später die Datensätze der referenzierten Tabelle löschen zu können.

Gibt es dafür eine elegantere Methode? (disable triggers …?)

Du könntest 9.0 verwenden und dir DEFERRED für Foreign Keys anschauen.

DEFERRED gibt es laut Release Notes zu 9.0 nur für Unique Constraints…

Stimmt. Constraints kann man ja jetzt schon als DEFERRABLE INITIALLY DEFERRED anlegen.

O.K., verstanden. Nett, daß ich nicht nur ein RTFM als Antwort erhielt. Berechtigt wäre es jedenfalls gewesen. :rolleyes: Vielen Dank.

Nun ja, RTFM hat 4 Buchstaben und das Forum verlangt 10 Zeichen als Eingabe.
Hast also noch mal Glück gehabt g