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čí spustitDELETE
, 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 plpgsqlCASE
se mírně liší od SQLCASE
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