PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zeilen mit Fremdschlüssel in PostgreSQL löschen

Um dies zu automatisieren, könnten Sie die Fremdschlüsseleinschränkung mit ON DELETE CASCADE definieren .
Ich zitiere das Handbuch für Fremdschlüsseleinschränkungen :

Suchen Sie die aktuelle FK-Definition wie folgt:

SELECT pg_get_constraintdef(oid) AS constraint_def
FROM   pg_constraint
WHERE  conrelid = 'public.kontakty'::regclass  -- assuming public schema
AND    conname = 'kontakty_ibfk_1';

Fügen Sie dann den ON DELETE ... hinzu oder ändern Sie ihn Teil zu ON DELETE CASCADE (wobei alles andere unverändert bleibt) in einer Anweisung wie:

ALTER TABLE kontakty
   DROP CONSTRAINT kontakty_ibfk_1
 , ADD  CONSTRAINT kontakty_ibfk_1
   FOREIGN KEY (id_osoby) REFERENCES osoby (id_osoby) ON DELETE CASCADE;

Es gibt kein ALTER CONSTRAINT Befehl. Löschen Sie die Einschränkung und erstellen Sie sie in einem einzelnen ALTER TABLE neu -Anweisung, um mögliche Race-Conditions bei gleichzeitigem Schreibzugriff zu vermeiden.

Natürlich benötigen Sie die Berechtigungen dazu. Die Operation nimmt einen ACCESS EXCLUSIVE an Sperre auf Tabelle kontakty und ein SHARE ROW EXCLUSIVE Sperre auf Tabelle osoby .

Wenn Sie nicht ALTER können der Tabelle, dann manuelles Löschen (einmalig) oder per Trigger BEFORE DELETE (jedes Mal) sind die verbleibenden Optionen.