2010-07-12 14 views
5

मैं पाइथन के माध्यम से उपयोग करने के लिए एक सरल SQLite डेटाबेस स्थापित करने पर काम कर रहा हूं। अब तक मेरे पास एक मूल तालिका है, और कुछ ट्रिगर्स हैं - जब मैं एक नया रिकॉर्ड जोड़ता हूं, तो एक फ़ील्ड कॉलम 'date_added' अपडेट करना चाहता है, और दूसरा रिकॉर्ड कॉल करने के बाद कॉलम 'date_updated' को अपडेट करना चाहता है । यहाँ चलाता के लिए मेरी SQLite वाक्य रचना है:एसक्लाइट अद्यतन INSERT बयान पर ट्रिगर फायरिंग भी?

CREATE TRIGGER add_contact AFTER INSERT ON contact_info 
BEGIN 
    UPDATE contact_info SET date_added = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

CREATE TRIGGER update_contact AFTER UPDATE ON contact_info 
BEGIN 
    UPDATE contact_info SET date_updated = DATETIME('NOW') WHERE pkid = new.pkid; 
END; 

'add_contact' ट्रिगर ठीक काम कर रहा है ... यह जब मैं योजना के अनुसार एक एसक्यूएल सम्मिलित करें आदेश के माध्यम से एक नया रिकॉर्ड जोड़ने के लिए, सक्रिय करता है।

समस्या 'update_contact' ट्रिगर हो रहा है ... यह आग दोनों जब मैं एक एसक्यूएल अद्यतन आदेश के माध्यम से एक रिकॉर्ड को अपडेट (के रूप में की योजना बनाई) और जब मैं भी एक नया रिकार्ड जोड़ें:

यानी जब मैं एक नया रिकॉर्ड जोड़ने मैं 'DATE_ADDED' और 'date_updated' कॉलम में यह मिलता है:

2010-07-12 05:00:06|2010-07-12 05:00:06 

और जब मैं उस रिकॉर्ड को अपडेट, यह बहुत की तरह परिवर्तन:

2010-07-12 05:00:06|2010-07-12 05:14:26 

मुझे लगता है कि मुझे नहीं मिल रहा है क्यों अद्यतन ट्रिगर INSERT पर भी आग लगती है?

TIA,

मोंटे

संपादित जोड़ने के लिए: कैसे के रूप में इरादा यह काम करने के लिए पर कोई संकेत?

उत्तर

6

आपके पास अपने INSERT ट्रिगर में एक अपडेट है। तो INSERT एक अद्यतन का कारण बनता है। जो आपने एक अलग ट्रिगर के साथ लगाया है।

+0

ओह! मैं देखता हूं कि आपका क्या मतलब है;) कोई विचार है कि दो अलग ट्रिगर्स के मूल लक्ष्यों को कैसे प्राप्त किया जाए, जो एक INSERT पर आग लगती है, और जो अद्यतन पर आग लगती है? ऐसा लगता है कि किसी भी फ़ील्ड के अपडेट पर 'update_contact' ट्रिगर को आग लगाने का कोई तरीका था * * date_added को छोड़कर, इसे करना चाहिए। बस यह सुनिश्चित न करें कि इसके बारे में कैसे जाना है ... – memilanuk

+1

@memilanuk: आप OLD.date_added की तुलना अपने UPDATE ट्रिगर में NEW.date_added से कर सकते हैं? – Borealid

+1

बस पुराने धागे पर एक अपडेट, क्योंकि मैं आज कोड में कोड के साथ टंकण करने के लिए चारों ओर मिल गया। मैंने ट्रिगर कोड को पढ़ने के लिए बदल दिया: अद्यतन contact_info SET date_updated = DATETIME ('अब') जहां pkid = new.pkid और डेटाटाइम ('अब')! = Date_added; काम करने लगता है। सही दिशा में नजदीक के लिए धन्यवाद! – memilanuk

8

मूल समस्या से बचने का एक बेहतर तरीका तालिका परिभाषा में date_added कॉलम के लिए क्लॉज का उपयोग करना है, INSERT ट्रिगर का उपयोग करने के बजाय।

+2

और सुनिश्चित करें कि * नहीं * INSERT बयानों में date_added कॉलम शामिल है। SQLite3 किसी दिए गए कॉलम के लिए NULL डालने पर DEFULT क्लॉज निष्पादित नहीं करता प्रतीत होता है। –

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