Още няколко съвета относно вашата функция за задействане:
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;
Основни точки
-
Вашата проверка за съществуване с
SELECT
изявление удвоява разходите. Просто стартирайтеDELETE
, ако не бъде намерен съответстващ ред, нищо не се изтрива. -
Използвайте
CASE
изявление тук. По-кратко, по-бързо. Обърнете внимание, че plpgsqlCASE
е малко по-различен от SQLCASE
изявление. Например, можете да изброите няколко случая наведнъж. -
Нямате нужда от
DECLARE
ключова дума, освен ако всъщност не декларирате променливи.
Алтернативен дизайн
Бихте могли да избегнете проблема като цяло чрез каскадни изтривания чрез външен ключ , като @a_horse, споменат в коментара . Оформлението на моята схема ще изглежда така:
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
);
...
Относно serial
:
Автоматично нарастване на SQL функция