2012-03-31 20 views
6

मैं इस ट्रिगर के अनुसार एक मेज अद्यतन करने के लिए कोशिश कर रहा हूँ:PostgreSQL उत्प्रेरक और पंक्तियों अद्यतन

CREATE TRIGGER alert 
AFTER UPDATE ON cars 
FOR EACH ROW 
EXECUTE PROCEDURE update_cars(); 

उत्प्रेरक फंक्शन:

CREATE FUNCTION update_cars() 
RETURNS 'TRIGGER' 
AS $BODY$ 
BEGIN 
IF (TG_OP = 'UPDATE') THEN 
UPDATE hello_cars SET status = new.status 
WHERE OLD.ID = NEW.ID; 
END IF; 
RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

ट्रिगर ठीक काम करता है। जब cars तालिका अपडेट की जाती है, तो hello_cars तालिका अपडेट की जाती है लेकिन प्रत्येक पंक्ति में स्थिति कॉलम अपडेट होता है और इसमें एक ही नई स्थिति होती है! इसे एक कार आईडी के अनुसार अपडेट किया जाना चाहिए।
मुझे लगता है कि मेरी समस्या हालत में है: WHERE OLD.ID = NEW.ID; लेकिन मैं यह नहीं बता सकता कि क्या गलत है।

अग्रिम धन्यवाद।

उत्तर

5

OLD और NEW ट्रिगर को निकालने वाली पंक्तियों के उपनाम हैं। तो जब आप की तरह

UPDATE cars SET status='xyz' WHERE cars.id = 42; 

एक बयान पर अमल तो ट्रिगर समारोह निष्पादित करेंगे

UPDATE hello_cars SET status='xyz' WHERE 42 = 42 

हिस्सा 42=42 हमेशा सच है। इसलिए hello_cars में प्रत्येक पंक्ति अपडेट की गई है।

आप वास्तव में की तरह

[...]WHERE hello_cars.id = OLD.ID 

या एक छोटे से कुछ चाहते हैं कम

[...]WHERE id = OLD.ID 

लेकिन क्या आप भी, तो क्या होता है प्रारंभिक परिवर्तन अद्यतन cars.id के बारे में सोचने की जरूरत है। इस मामले में OLD.ID बराबर NEW.ID नहीं है। इस मामले में तालिका hello_cars में क्या होना चाहिए? लेकिन यह एक और सवाल है।

+0

धन्यवाद आप बहुत बहुत! – Noon

+0

@Shadin: आपका स्वागत है। कृपया [एफएक्यू/कैसे पूछें] देखें (http://stackoverflow.com/faq#howtoask) उस उत्तर को कैसे स्वीकार करें जिसने आपको सबसे अधिक मदद की। –

6

OLD.ID और NEW.IDमूल्यों संदर्भित कर रहे हैं तालिका cars का अद्यतन पंक्ति में और इस प्रकार (जब तक आप cars में आईडी बदलने) हमेशा सच और वजह hello_cars में सभी पंक्तियों को अपडेट किया जाता है करने के लिए मूल्यांकन करेंगे।

मुझे लगता है कि आप शायद चाहते हैं:

UPDATE hello_cars 
    SET status = new.status 
WHERE id = new.id; 

इसमें यह माना जाता तालिका hello_cars कि cars में id से मेल खाता है में एक स्तंभ id नहीं है।

+0

धन्यवाद आप बहुत बहुत धन्यवाद! यह बहुत अच्छा काम करता है – Noon

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