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 deDELETE
. uit , als er geen overeenkomende rij wordt gevonden, wordt er niets verwijderd. -
Gebruik een
CASE
verklaring hier. Korter, sneller. Merk op dat plpgsqlCASE
is iets anders dan SQLCASE
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