2011-07-21 11 views
7

के कारण विफल रहता है मेरे पास दो mysql प्रश्नों वाला कोड है।
DELETE FROM my_table WHERE user_id=some_number
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...)हटाए जाने के बाद mysql डालने "डुप्लिकेट प्रविष्टि"

क्षेत्र user_id अद्वितीय है।

दुर्लभ मामलों में सम्मिलित डुप्लिकेट प्रविष्टि का दावा करने में विफल रहता है। मेरा पहला वृत्ति मुझे विश्वास दिलाता है कि डेलेटी खत्म नहीं हुआ है और अब सम्मिलित करने की कोशिश कर रहा है और मुझे डुप्लिकेट प्रविष्टि मिल रही है। क्या यह संभव है? इससे कैसे बचा जा सकता है? क्या आप एक अलग स्पष्टीकरण के बारे में सोच सकते हैं?

अपडेट: कारण मैं हटा रहा हूं क्योंकि मैं उन सभी डेटा को हटाना चाहता हूं जिन्हें मैं पहली बार अद्यतन/सम्मिलित नहीं कर रहा हूं। साथ ही, मुझे लगता है कि यह कहना महत्वपूर्ण है कि अधिकांश डेटा वही रहता है।

+0

क्या यह संभव है कि यह एक दौड़ की स्थिति है जहां दो प्रक्रियाएं एक ही आईडी के लिए दो बयान जारी कर रही हैं? –

+0

आपको प्रतिस्थापन और INSERT में रुचि हो सकती है ... डिप्लिकेट कुंजी अपडेट स्टेटमेंट –

+1

यह संभव है कि DELETE विफल हो जाए? क्या इसके निष्पादन के बाद कुछ जांच है? – ascanio

उत्तर

1

आप इसे पूरा करने के लिए DELETE के बाद हमेशा एक COMMIT आज़मा सकते हैं।

UPDATE my_table 
SET my_column = my_value 
WHERE user_id = some_number 
+0

मुझे बस कोशिश करने के लिए "COMMIT" के साथ एक और क्वेरी जोड़ने की आवश्यकता है? यदि धीमे अन्य प्रश्न हैं तो क्या यह उनके लिए भी इंतजार करेगा या क्या मैं सिर्फ हटाने के लिए प्रतीक्षा करने के लिए कह सकता हूं? – Noam

+0

हां, आप स्वयं ही प्रतिबद्धता कर सकते हैं। आपके कोड के पोस्ट किए गए कार्यों से वास्तव में इसकी आवश्यकता नहीं होनी चाहिए, लेकिन यह पहला कथन पूरा करने के मुद्दे को मजबूर करेगा। –

2

बजाय एक अद्यतन बयान का प्रयोग करें?

+0

आप कर सकते हैं (यह 'INSERT INTO' वाक्यविन्यास पर एक MySQL संस्करण है)। यहाँ देखें; http://dev.mysql.com/doc/refman/5.1/en/insert.html –

+0

@ypercube आप सही हैं। –

+0

अद्यतन उस पुराने डेटा को नहीं हटाएगा जिसे मैं प्रतिस्थापित करना चाहता हूं। सही? – Noam

2
SET AUTOCOMMIT=0;  
START TRANSACTION;  
DELETE FROM my_table WHERE user_id=some_number;  
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...); 
commit; 
1

तुम क्यों DELETE और फिर INSERT ही user_id और न सिर्फ UPDATE पंक्ति कार्य करें:

+0

क्योंकि मैं उन सभी डेटा को हटाना चाहता हूं जिन्हें मैं पहली बार अद्यतन/सम्मिलित नहीं कर रहा हूं, और मैं हूं एक ही डेटा के साथ सभी पंक्तियों को अद्यतन नहीं। प्रत्येक नई पंक्ति/अद्यतन पंक्ति में अलग-अलग डेटा होंगे। – Noam

-2

ऐसा इसलिए होता है क्योंकि क्वेरी को दो एकल लेनदेन के रूप में माना जाता है, इसलिए निष्पादन का आदेश गारंटी नहीं है। जिस प्रभाव का आप वर्णन कर रहे हैं वह है क्योंकि डालने से पहले सम्मिलन संसाधित किया जाता है। आपको क्वेरी तर्क बदलना चाहिए या एक ही लेनदेन में दोनों प्रश्नों को निष्पादित करना चाहिए।

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