Nogle flere råd om din triggerfunktion:
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;
Vigtige punkter
-
Din kontrol for eksistens med en
SELECT
erklæring fordobler omkostningerne. Bare kørDELETE
, hvis der ikke findes en matchende række, slettes intet. -
Brug en
CASE
udtalelse her. Kortere, hurtigere. Bemærk at plpgsqlCASE
er lidt anderledes end SQLCASE
udmelding. Du kan f.eks. liste flere sager på én gang. -
Du behøver ikke
DECLARE
søgeord, medmindre du faktisk erklærer variabler.
Alternativt design
Du kan undgå problemet helt ved at kaskadesletninger via fremmednøgle , som @a_horse nævnt i kommentaren . Mit skemalayout ville se sådan ud:
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
);
...
Om serial
:
Automatisk inkrementering af SQL-funktion