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

Attiva per eliminare le righe dalle tabelle correlate prima di eliminare le righe dalla tabella effettiva

Qualche consiglio in più sulla tua funzione di trigger:

CREATE OR REPLACE FUNCTION delete_question()
  RETURNS trigger AS
$func$
BEGIN

CASE OLD.que_type
WHEN 1 THEN
    DELETE FROM mcq   WHERE que_id=OLD.id;
WHEN 2, 3 THEN
    DELETE FROM tffb  WHERE que_id=OLD.id;
WHEN 4 THEN
    DELETE FROM essay WHERE que_id=OLD.id;
-- ELSE
--      Do something?
END CASE;

RETURN OLD;

END
$func$ LANGUAGE plpgsql;

Punti principali

  • Il tuo assegno di esistenza con un SELECT dichiarazione raddoppia il costo. Basta eseguire DELETE , se non viene trovata alcuna riga corrispondente, non viene eliminato nulla.

  • Usa un CASE dichiarazione qui. Più corto, più veloce. Nota che plpgsql CASE è leggermente diverso da SQL CASE dichiarazione. Ad esempio, puoi elencare più casi contemporaneamente.

  • Non è necessario il DECLARE parola chiave, a meno che tu non dichiari effettivamente variabili.

Design alternativo

Potresti evitare del tutto il problema eliminazioni a cascata tramite chiave esterna , come @a_horse menzionato nel commento . Il layout del mio schema sarebbe simile a questo:

CREATE TABLE question (
   question_id serial NOT NULL PRIMARY KEY
  ,que_type    int   -- this may be redundant as well
);

CREATE TABLE essay (
   que_id int NOT NULL PRIMARY KEY
              REFERNECES question(question_id) ON UPDATE CASCADE
                                               ON DELETE CASCADE
  ,ans    text
);

...

Informazioni su serial :
Funzione SQL di incremento automatico