PostgreSql: Ermittelt alle Zeilen, die (über Fremdschlüssel) auf eine bestimmte Zeile in einer Tabelle verweisen

8

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:

%Vor%

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?

    
cassava 16.01.2013, 11:17
quelle

2 Antworten

4

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 .

    
Igor Romanchenko 16.01.2013, 11:35
quelle
0
%Vor%

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:

%Vor%     
wildplasser 16.01.2013 11:24
quelle

Tags und Links