UPDATE को MySQL ट्रिगर आंकड़े तालिका में घंटे डेटा नहीं भेज रहा है - mysql, eventtrigger

मेरे पास UPDATE क्वेरी के चलने के आधार पर आँकड़ों को अपडेट करने के लिए MySQL ट्रिगर है।

The trigger is:

DELIMITER //

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours

FOR EACH ROW

BEGIN

IF NEW.hours_committed = "completed" THEN


INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES

(OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),

(NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)

ON DUPLICATE KEY UPDATE

completed_hours = completed_hours + VALUES(completed_hours);


END IF;

END//

काम करने का प्रश्न:

UPDATE user_hours JOIN user_calendar USING (user_calendar_id, opportunity_id)
SET    user_hours.completed_hours = agreed_hours,
user_hours.hours_committed = "completed"
WHERE  user_hours.hours_committed = "accepted"
AND user_hours.completed_hours IS NULL
AND user_calendar.date_start = CURRENT_DATE();

मेरे पास उपरोक्त के समान एक और क्वेरी है जो एक ही तालिका को अपडेट करती है लेकिन थोड़े अंतर के साथ जो पूरी की गई_हॉर्स की जाँच शून्य नहीं है। क्वेरी निम्नानुसार है:

UPDATE user_hours JOIN user_calendar USING (user_calendar_id, opportunity_id)
SET    user_hours.hours_committed = "completed"
WHERE  user_hours.hours_committed = "accepted"
AND user_hours.completed_hours IS NOT NULL
AND user_calendar.date_start = "2012-08-23"

उपरोक्त अद्यतन ट्रिगर को ट्रिगर करता है, हालांकि आंकड़ों की तालिका में अंतिम अपडेट क्वेरी के लिए 0 के रूप में पूर्ण_हॉर्स दिखाते हैं।

ट्रिगर्स के बेहतर ज्ञान के साथ कोई भी मेरी मदद करने में सक्षम है?

धन्यवाद,

निशान

उत्तर:

उत्तर № 1 के लिए 1

समाधान था:

DELIMITER //

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours

FOR EACH ROW

BEGIN

IF  NEW.hours_committed =  "completed"  THEN
IF OLD.completed_hours IS NULL THEN
BEGIN
INSERT INTO hours_statistics (user_id,opportunity_id,completed_hours)
VALUES
(OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
(NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
ON DUPLICATE KEY UPDATE
completed_hours = completed_hours + VALUES(completed_hours);
END;
ELSE
INSERT INTO hours_statistics (user_id,opportunity_id,completed_hours)
VALUES
(NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
ON DUPLICATE KEY UPDATE
completed_hours = completed_hours + VALUES(completed_hours);
END IF;
END  IF;


END//

जवाब के लिए 0 № 2

INSERT में, आप दो पंक्ति संचालन कर रहे हैं - एक घटाव और एक जोड़।

जब आपके पास एक डुप्लिकेट होता है, तो ON DUPLICATE KEY दो बार चलेगी - एक बार घटाव के लिए और एक बार जोड़ के लिए।

आपकी दूसरी क्वेरी में, पूर्ण_हॉर्स के लिए कोई परिवर्तित मान नहीं है, इसलिए OLD और NEW समान होंगे। आप मान जोड़ेंगे, फिर मूल्य घटाएँ, उपज 0।

शायद :)

यदि नहीं, तो आपको कहीं न कहीं NULL की समस्या है।

संपादित करें: मुझे यकीन नहीं है कि मैं स्पष्ट था। यहाँ अधिक स्पष्ट होने का प्रयास है:

आप अपना दूसरा अपडेट करें:

UPDATE user_hours JOIN user_calendar USING (user_calendar_id, opportunity_id)
SET    user_hours.hours_committed = "completed" ...

मान लें कि इसे अपडेट करने के लिए एक user_hours पंक्ति मिलती है, जो इस तरह दिखता है:

user_id = 1
opportunity_id = 2
hours_committed = "accepted"
completed_hours = 10

और फिर यह ट्रिगर को फायर करता है, जो दो INSERTS चलाना चाहता है:

INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES (1,2,-10)

INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES (1,2,+10)

यदि UNIQUE कुंजी का उल्लंघन किया जाता है, तो यह प्रभावी रूप से दो बार ON DUPLICATE प्रमुख भाग को चलाएगा:

UPDATE hour_statistics set completed_hours = completed_hours + -10 WHERE...

UPDATE hour_statistics set completed_hours = completed_hours + 10 WHERE...

मैं जिस बिंदु को बनाने की कोशिश कर रहा था, वह यह है कि पिछले दो को एक दूसरे को ऑफसेट करना चाहिए। यदि मूल घंटा_स्टैटिस्टिक्स डॉटप्लेटेड_हॉर्स 0 था, तो ट्रिगर फायर के बाद यह 0 होगा।

इस समय समझ में आता है?


संबंधित सवाल
सबसे लोकप्रिय