आपके ट्रिगर फ़ंक्शन के बारे में कुछ और सलाह:
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
की आवश्यकता नहीं है कीवर्ड, जब तक कि आप वास्तव में चर घोषित नहीं करते।
वैकल्पिक डिज़ाइन
आप कैस्केडिंग डिलीट्स द्वारा इस समस्या से पूरी तरह बच सकते हैं विदेशी कुंजी के माध्यम से , के रूप में वास्तविक/20051513#comment29864955_20035105">@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 फंक्शन