सबसे पहले, आपके मूल प्रयास से कुछ सिंटैक्स त्रुटियाँ हमारे रास्ते से हट रही हैं:
FOR EACH STATEMENT
के बजाय , यहFOR EACH ROW
. होना चाहिए ।- चूंकि आपने पहले ही डिलीमीटर को
//
में परिभाषित कर दिया है; आपको//
. का उपयोग करने की आवश्यकता है (;
)DROP TRIGGER IF EXISTS ..
. में बयान। Row_Count()
Before Delete Trigger
में 0 मान होगा , क्योंकि अभी तक कोई पंक्ति अपडेट नहीं की गई है। तो यह तरीका काम नहीं करेगा।
अब, यहां ट्रिक सत्र-स्तरीय पहुंच योग्य (और स्थायी) का उपयोग करना है उपयोगकर्ता-परिभाषित चर
. हम एक वेरिएबल को परिभाषित कर सकते हैं, मान लें कि @rows_being_deleted
, और बाद में जांचें कि यह पहले से परिभाषित है या नहीं।
FOR EACH ROW
हटाई जा रही . प्रत्येक पंक्ति के लिए कथनों का एक ही सेट चलाता है . इसलिए, हम सिर्फ यह जांचेंगे कि सत्र चर पहले से मौजूद है या नहीं। यदि ऐसा नहीं है, तो हम इसे परिभाषित कर सकते हैं। तो मूल रूप से, पहली पंक्ति (हटाए जाने के लिए) के लिए, इसे परिभाषित किया जाएगा, जो तब तक जारी रहेगा जब तक सत्र है।
अब यदि और पंक्तियों को हटाना है, तो ट्रिगर शेष पंक्तियों के लिए कथनों का एक ही सेट चलाएगा। दूसरी पंक्ति में, पहले से परिभाषित चर अब मिलेगा, और हम अब केवल एक अपवाद फेंक सकते हैं।
नोट एक मौका है कि एक ही सत्र के भीतर, कई डिलीट स्टेटमेंट ट्रिगर हो सकते हैं। इसलिए अपवाद फेंकने से पहले, हमें @rows_being_deleted
. सेट करना होगा मान वापस null
।
निम्नलिखित कार्य करेगा:
DELIMITER //
DROP TRIGGER IF EXISTS prevent_multiple_deletion //
CREATE TRIGGER prevent_multiple_deletion
BEFORE DELETE ON `test`
FOR EACH ROW
BEGIN
-- check if the variable is already defined or not
IF( @rows_being_deleted IS NULL ) THEN
SET @rows_being_deleted = 1; -- set its value
ELSE -- it already exists and we are in next "row"
-- just for testing to check the row count
-- SET @rows_being_deleted = @rows_being_deleted + 1;
-- We have to reset it to null, as within same session
-- another delete statement may be triggered.
SET @rows_being_deleted = NULL;
-- throw exception
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot delete more than one order per time!';
END IF;
END //
DELIMITER ;
डीबी फिडल डेमो 1 :पंक्ति से अधिक हटाने की कोशिश कर रहा है।
DELETE FROM `test` WHERE `id`< 5;
परिणाम:
डीबी फिडल डेमो 2 :केवल एक पंक्ति को हटाने का प्रयास कर रहा है
क्वेरी #1
DELETE FROM `test` WHERE `id` = 1;
क्वेरी #2
SELECT * FROM `test`;
| id | a | b |
| --- | --- | --- |
| 2 | 3 | 4 |