sql >> Databáze >  >> RDS >> PostgreSQL

Spusťte pro odstranění řádků ze souvisejících tabulek před odstraněním řádků ze skutečné tabulky

Několik dalších rad ohledně vaší spouštěcí funkce:

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;

Hlavní body

  • Zkontrolujete existenci pomocí SELECT výpis zdvojnásobí náklady. Stačí spustit DELETE , pokud není nalezen žádný odpovídající řádek, nic se nesmaže.

  • Použijte CASE prohlášení zde. Kratší, rychlejší. Všimněte si, že plpgsql CASE se mírně liší od SQL CASE tvrzení. Můžete například uvést několik případů najednou.

  • Nepotřebujete DECLARE klíčové slovo, pokud ve skutečnosti nedeklarujete proměnné.

Alternativní design

Problému se můžete úplně vyhnout kaskádovým mazáním prostřednictvím cizího klíče , jako @a_horse zmíněn v komentáři . Moje rozložení schématu by vypadalo takto:

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

...

O serial :
Automatické zvýšení funkce SQL



  1. Extrahujte měsíc z data v PostgreSQL

  2. Jak Left Join / IS NULL eliminuje záznamy, které jsou v jedné tabulce a ne ve druhé?

  3. MySQL zkrátí zřetězený výsledek funkce GROUP_CONCAT

  4. Jak mohu vynutit, aby poddotaz fungoval stejně dobře jako #temp tabulka?