मेरे पास 2 टेबल हैं: comments
और comments_likes
।एक ट्रिगर (बिना ट्रिगर को अक्षम करने के लिए) के बिना mysql में एक क्वेरी बनाएं
टिप्पणी
id
message
likes
चलाता है:
के बाद उसे हटा
DELETE FROM comments_likes WHERE comment_id = OLD.id;
comments_likes
id
comment_id
चलाता है:
के बाद सम्मिलित करें
UPDATE comments SET likes = likes + 1 WHERE comments.id = NEW.comment_id;
के बाद उसे हटा
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
अद्यतन
**omited code, updates comments**
तो सवाल यह है के बाद, मैं जब उन्हें एक ट्रिगर से सक्रिय चलाता निष्क्रिय कर सकते हैं?
क्या मैं चाहता हूँ कुछ करना है यह पसंद है:
के बाद उसे हटा
IF NOT called_from_another_trigger() THEN
UPDATE comments SET likes = likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
[संपादित करें]
एक गैर अनुकूलित समाधान (बहुत धीमी गति से क्वेरी होगा ... प्रत्येक LIKE रजिस्टर के लिए एक क्वेरी बनाता है):
BEGIN
IF (SELECT id FROM comments WHERE comments.id = OLD.comment_id) THEN
UPDATE comments SET comments.cache_likes = comments.cache_likes - 1 WHERE comments.id = OLD.comment_id;
END IF;
END
अद्यतन LOW PRIORITY
और IGNORE
काम नहीं करता है।
[संपादित करें 2]
मैं एक विचार है, पहले ट्रिगर में एक वैश्विक चर सेट और अन्य ट्रिगर से इसे पढ़ने के लिए संभव है?
पूर्व:
पहले ट्रिगर:
@disable_triggers = true;
// do the stuff that calls another triggers
@disable_triggers = false;
अन्य ट्रिगर:
if @disable_triggers = false then
// do the stuff
end if;
इंजेस्टिंग! क्या आप वास्तव में ट्रिगर के अंदर ट्रिगर्स को अक्षम कर सकते हैं? – Mchl
@Mchl: हाँ, इस विधि के साथ आप कर सकते हैं :) @var कनेक्शन के लिए globals हैं। आपको IS NULL का उपयोग करना चाहिए क्योंकि वेरिएबल्स जिन्हें परिभाषित नहीं किया गया है वे हमेशा शून्य होते हैं। – Wiliam
इससे मुझे 4 साल बाद मदद मिली! मैं बिल्कुल इस तरह कुछ ढूंढ रहा था। Googling के 1 घंटे के बाद और एसओ खोज, मैं अंत में आपका जवाब मिला। यह इतना आसान है, लेकिन मैंने कभी इसे अपने आप से नहीं समझा होगा। मैं सिर्फ mysql के साथ "प्रोग्राम" करने में सक्षम होने के लिए उपयोग नहीं किया जाता है। –