Beberapa saran lagi tentang fungsi pemicu Anda:
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;
Poin utama
-
Periksa keberadaan Anda dengan
SELECT
pernyataan menggandakan biaya. Jalankan sajaDELETE
, jika tidak ada baris yang cocok ditemukan, tidak ada yang dihapus. -
Gunakan
CASE
pernyataan di sini. Lebih pendek, lebih cepat. Perhatikan bahwa plpgsqlCASE
sedikit berbeda dari SQLCASE
penyataan. Misalnya, Anda dapat membuat daftar beberapa kasus sekaligus. -
Anda tidak memerlukan
DECLARE
kata kunci, kecuali jika Anda benar-benar mendeklarasikan variabel.
Desain alternatif
Anda dapat menghindari masalah sama sekali dengan penghapusan berjenjang melalui kunci asing , sebagai @a_horse disebutkan dalam komentar . Tata letak skema saya akan terlihat seperti ini:
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
);
...
Tentang serial
:
Fungsi SQL peningkatan otomatis