PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Elimina le righe con chiave esterna in PostgreSQL

Per automatizzare questo, puoi definire il vincolo di chiave esterna con ON DELETE CASCADE .
Cito il il manuale per vincoli di chiave esterna :

Cerca l'attuale definizione FK in questo modo:

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

Quindi aggiungi o modifica il ON DELETE ... parte a ON DELETE CASCADE (conservando tutto il resto così com'è) in una dichiarazione come:

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

Non ci sono ALTER CONSTRAINT comando. Elimina e ricrea il vincolo in un unico ALTER TABLE dichiarazione per evitare possibili condizioni di gara con accesso in scrittura simultaneo.

Hai bisogno dei privilegi per farlo, ovviamente. L'operazione richiede un ACCESS EXCLUSIVE lock on table kontakty e un SHARE ROW EXCLUSIVE lock on table osoby .

Se non riesci a ALTER la tabella, quindi eliminando manualmente (una volta) o tramite trigger BEFORE DELETE (ogni volta) sono le opzioni rimanenti.