Das scheint so einfach zu sein, aber ich konnte keine Antwort auf diese Frage finden.
Was möchte ich? Eine Master-Tabelle mit Zeilen, die sich selbst löschen, wenn sie nicht mehr (über Fremdschlüssel) referenziert werden. Die Lösung kann für PostgreSql spezifisch sein oder nicht.
Wie? Einer meiner Ansätze zur Lösung dieses Problems (eigentlich der einzige Ansatz bisher) beinhaltet Folgendes: Für jede Tabelle, die auf diese Master-Tabelle verweist, in UPDATE
oder DELETE
einer Zeile, um nach der referenzierten Zeile im Master zu suchen, wie viele andere Zeilen sich noch auf die referenzierte Zeile beziehen. Wenn es auf Null fällt, lösche ich auch diese Zeile im Master.
(Wenn Sie eine bessere Idee haben, würde ich es gerne wissen!)
Im Detail: Ich habe eine Master-Tabelle, auf die viele andere verweisen
%Vor%Alle anderen Tabellen haben im Allgemeinen das gleiche Format:
%Vor% Wenn eine davon nicht NULL
ist, beziehen sie sich auf eine Zeile in master
. Wenn ich dazu gehe und versuche, es zu löschen, werde ich eine Fehlermeldung erhalten, weil es bereits darauf bezogen ist:
Beachten Sie, dass es nicht zu lange dauert, das herauszufinden, auch wenn ich viele Tabellen habe, die auf master
verweisen. Wie finde ich diese Informationen, ohne einen Fehler zu melden?
Sie können einen der folgenden Schritte ausführen:
1) Fügen Sie das Feld reference_count
zur Master-Tabelle hinzu. Wenn Sie Trigger für Detailtabellen verwenden, wird reference count
immer dann erhöht, wenn eine Zeile mit dieser master_id
hinzugefügt wird. Verringern Sie die Anzahl, wenn die Zeile gelöscht wird. Wenn reference_count
0 erreicht, lösche den Datensatz.
2) Verwenden Sie pg_constraint
table (Details hier ) um zu bekommen die Liste der referenzierenden Tabellen und erstellen Sie eine dynamische SQL-Abfrage.
3) Erstellen Sie Trigger für jede Detailtabelle, die master_id
in der Haupttabelle löscht. Silence-Fehlermeldungen mit BEGIN ... EXCEPTION ... END
.
Oder umgekehrt:
%Vor% SO, wenn Sie nur die Zeilen im Master aktualisieren (oder löschen) möchten, die nicht von other
referenziert werden, könnten Sie:
Tags und Links sql database postgresql