Kilka dodatkowych porad dotyczących funkcji wyzwalania:
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;
Główne punkty
-
Twój czek na istnienie za pomocą
SELECT
oświadczenie podwaja koszt. Po prostu uruchomDELETE
, jeśli nie zostanie znaleziony pasujący wiersz, nic nie zostanie usunięte. -
Użyj
CASE
oświadczenie tutaj. Krótszy, szybszy. Zauważ, że plpgsqlCASE
różni się nieco od SQLCASE
oświadczenie. Na przykład możesz wymienić kilka spraw jednocześnie. -
Nie potrzebujesz
DECLARE
słowa kluczowego, chyba że faktycznie zadeklarujesz zmienne.
Alternatywny projekt
Możesz całkowicie uniknąć problemu, kaskadowe usuwanie za pomocą klucza obcego , jako @a_koń wspomniany w komentarzu . Mój układ schematu wyglądałby tak:
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
);
...
Informacje o serial
:
Funkcja automatycznej inkrementacji SQL