sql >> Database >  >> RDS >> PostgreSQL

Trigger om rijen uit gerelateerde tabellen te verwijderen voordat rijen uit de werkelijke tabel worden verwijderd

Nog wat advies over je triggerfunctie:

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;

Belangrijkste punten

  • Uw controle op bestaan ​​met een SELECT verklaring verdubbelt de kosten. Voer gewoon de DELETE . uit , als er geen overeenkomende rij wordt gevonden, wordt er niets verwijderd.

  • Gebruik een CASE verklaring hier. Korter, sneller. Merk op dat plpgsql CASE is iets anders dan SQL CASE uitspraak. U kunt bijvoorbeeld meerdere gevallen tegelijk opsommen.

  • Je hebt de DECLARE . niet nodig zoekwoord, tenzij u daadwerkelijk variabelen declareert.

Alternatief ontwerp

U kunt het probleem helemaal vermijden door cascade-verwijderingen via vreemde sleutel , als @a_horse genoemd in de opmerking . Mijn schemalay-out zou er als volgt uitzien:

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
);

...

Over serial :
SQL-functie automatisch verhogen



  1. Waarom duurt een zoekopdracht met een IN (subquery) langer dan een zoekopdracht met IN (discrete lijst)

  2. Trage zoekopdracht bij gebruik van ORDER BY

  3. Hoe maak ik een weergave in MySQL?

  4. Hoe een mysql-database met zijn gegevens exporteren en importeren met behulp van php-script?