2012-04-29 15 views
10

मेरा स्टोरेज INNODB है, मैं IF कथन में 2 प्रश्नों के साथ एक ट्रिगर बनाने की कोशिश कर रहा हूं। नीचे आप ट्रिगर है कि मुझे त्रुटिआईएसएच के साथ माइस्क्ल ट्रिगर

delimiter | 
CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
    FOR EACH ROW BEGIN 
    UPDATE counts SET count = count - 1 WHERE name = 'all'; 

    IF OLD.published = 1 THEN 
     DELETE FROM videos_categories WHERE id_video = OLD.id; 
     DELETE FROM videos_tags WHERE id_video = OLD.id; 
    END IF; 
    END; 
| 
delimiter ; 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= OLD.id; 
    END IF; 
    END' at line 6 

देता है देख सकते हैं इस हैं 2 से चलाता है मैं पहले एक साथ सक्रिय करें कि।

delimiter | 
CREATE TRIGGER count_delete_videos_tags AFTER DELETE ON videos_tags 
    FOR EACH ROW BEGIN 
    UPDATE tags SET count = count - 1 WHERE id = OLD.id_tag; 
    END; 
| 
delimiter ; 


delimiter | 
CREATE TRIGGER count_delete_videos_categories AFTER DELETE ON videos_categories 
    FOR EACH ROW BEGIN 
    UPDATE categories SET count = count - 1 WHERE id = OLD.id_category; 

    IF OLD.id_category <> 20 AND OLD.id_category <> 34 THEN 
     UPDATE counts SET count=count-1 WHERE name='english'; 
    ELSEIF OLD.id_category = 34 THEN 
     UPDATE counts SET count=count-1 WHERE name='german'; 
    ELSEIF OLD.id_category = 20 THEN 
     UPDATE counts SET count=count-1 WHERE name='italian'; 
    END IF; 
    END; 
| 
delimiter ; 

लेकिन यह एक पूरी तरह से काम करता है

delimiter | 
    CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
     FOR EACH ROW BEGIN 
     UPDATE counts SET count = count - 1 WHERE name = 'all'; 

     IF OLD.published = 1 THEN 
      DELETE FROM videos_categories WHERE id_video = OLD.id; 
     END IF; 
     END; 
    | 
    delimiter ; 

Query OK, 0 rows affected (0.16 sec) 

मैं पहले ट्रिगर काम कैसे कर सकते हैं? मैं क्या गलत कर रहा हूँ? Thx मेरी मदद करने के लिए।

+0

पर 'END END IF END' के पास उपयोग करने के लिए सही वाक्यविन्यास के लिए आपके मारियाडीबी सर्वर संस्करण से संबंधित मैन्युअल जांचें, क्या आप प्रत्येक डिलीट कथन के लिए दो बार क्लॉज दे सकते हैं और देख सकते हैं? – nawfal

+0

(काउंटर के अलावा), क्या आप जानते हैं कि एफके को 'डिलीट कैस्केड' के साथ परिभाषित करके, आप एक विदेशी कुंजी बाधा (प्रत्येक तालिका में से एक) के साथ 'वीडियो' टेबल पर एक ही व्यवहार कर सकते हैं? –

+0

हाँ मुझे पता है, लेकिन mysql में फ़िंगिंग कुंजी ट्रिगर्स सक्रिय नहीं हैं, इसलिए मुझे इसे किसी अन्य ट्रिगर के साथ हटा देना चाहिए ताकि यह प्रश्न अन्य ट्रिगर्स को सक्रिय कर सकें –

उत्तर

12

जहां तक ​​मेरा बता सकते हैं दोनों चलाता ठीक हैं, लेकिन आप कोशिश कर सकते हैं निम्नलिखित:

DELIMITER $$ 
CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
FOR EACH ROW 
BEGIN 
    UPDATE counts SET count = count - 1 WHERE name = 'all'; 

    IF OLD.published = 1 THEN BEGIN 
    DELETE FROM videos_categories WHERE id_video = OLD.id; 
    DELETE FROM videos_tags WHERE id_video = OLD.id; 
    END; END IF; 
END$$ 

DELIMITER ; 
+0

यह मुझे मिलता है -> ERROR 1235 (42000): MySQL का यह संस्करण नहीं है ' टी अभी तक एक ही क्रिया समय के साथ एकाधिक ट्रिगर्स और एक टेबल के लिए ईवेंट ' –

+0

@ पी.एलेक्स का समर्थन करता है - और आपका MySQL संस्करण क्या है? –

+1

@ पी। एलेक्स, जाहिर है आपको इसे जोड़ने से पहले अन्य ट्रिगर को हटाना होगा। – Johan

-1

परिसीमक $$ अपडेट से पहले TRIGGER upd_check खाता बनाते हैं पर प्रत्येक पंक्ति शुरू हो

 IF NEW.amount > 100 THEN 
      SET NEW.amount = 100 
    END END IF 
    END$$ 
    DELIMITER ; 

इस कोड में त्रुटि # 1064 जैसी त्रुटि दिखाती है - आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; लाइन 7

संबंधित मुद्दे