Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL कई पंक्तियों को हटाने से बचने के लिए ट्रिगर हटाने से पहले

सबसे पहले, आपके मूल प्रयास से कुछ सिंटैक्स त्रुटियाँ हमारे रास्ते से हट रही हैं:

  • 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   |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ज़ेंड फ्रेमवर्क डेवलपर के लिए सर्वश्रेष्ठ ई-कॉमर्स शॉपिंग कार्ट

  2. MySQL my.ini स्थान

  3. SQL - दो अलग-अलग तालिकाओं से पंक्तियों का चयन करें

  4. MySQL PHP ज़िप कोड तुलना विशेष रूप से दूरी

  5. रूबी:mysql2-Gem काम नहीं कर रहा है (Mac OS X स्नो लेपर्ड, रूबी 1.9.2)