2012-05-28 12 views
9

मेरे पास कुछ नेटवर्क उपकरण हैं जो एकाधिक नेटवर्क/वीएलएन्स (ए, बी & सी) से जुड़े हुए हैं, और अन्य उपकरण जो कि नेटवर्क में से किसी एक से जुड़े हुए हैं। जब मैं किसी नेटवर्क को हटाता या बदलता हूं, तो मुझे यह देखने के लिए अपना डेटाबेस अपडेट करना होगा कि उपकरण किससे जुड़ा हुआ है, इसलिए मैं ऐसा करने के लिए एक mysql कथन लिखने की कोशिश कर रहा हूं, लेकिन मैं विभिन्न सड़क ब्लॉक में चल रहा हूं।क्या "हटाएं" कथन का उपयोग करके दो रिकॉर्ड मर्ज करना संभव है?

मेरी तालिका में केवल दो फ़ील्ड हैं और डुप्लिकेट रिकॉर्ड नहीं हो सकते हैं। मेरे डेटा उदाहरण

deviceID network 
1  A 
1  B 
1  C 
2  B 
2  C 
3  A 
4  A 
5  B 

मैं कैसे नेटवर्क बी में नेटवर्क एक विलय कर सकते हैं तो उपरोक्त तालिका कैसा दिखेगा है ...

deviceID network 
1  B 
1  C 
2  B 
2  C 
3  B 
4  B 
5  B 

मेरे प्रारंभिक प्रयास करने के लिए सिर्फ set network = 'B' where network = 'A', एक DELETE network 'A' बयान के बाद था लेकिन वह डुप्लिकेट बनाएगा, जिसे उस तालिका के लिए अनुमति नहीं है - भले ही डुप्लिकेट संक्षिप्त हों। वैकल्पिक तरीकों का उपयोग करके, मैं WHERE EXISTS और विभिन्न FROM (SELECT) कथनों का उपयोग कर असफल mysql कथन में चल रहा हूं। क्या एक एकल mysql कथन में करना संभव है? क्या मुझे दो की ज़रूरत है?

किसी भी मदद की सराहना की जाती है।

उत्तर

10

। इसके बाद आप छोड़े गए पंक्तियों को साफ़ करने के लिए DELETE के साथ इसका पालन करेंगे।

UPDATE IGNORE mytable SET network = 'B' WHERE network = 'A'; 
DELETE FROM mytable WHERE network = 'A'; 

documentation से: उदाहरण के लिए:

IGNORE कीवर्ड के साथ

, अद्यतन बयान को निरस्त नहीं करता है, भले ही त्रुटियों अद्यतन दौरान होते हैं। पंक्तियां जिनके लिए डुप्लिकेट-कुंजी विवाद होते हैं अद्यतन नहीं होते हैं। पंक्तियां जिनके लिए स्तंभ मानों के लिए अद्यतन किए जाते हैं जो डेटा रूपांतरण त्रुटियों को निकटतम मान्य मानों के बजाय अपडेट किए जाते हैं।

+0

यह पूरी तरह से काम किया, धन्यवाद! – JonDoeCA

5

इसके बजाय दो कॉलम होने के, आप के रूप में यह तीन कॉलम बनाने पर विचार कर सकते
(अद्वितीय कुंजी अपरिवर्तित ही रहेंगे)

  • DeviceID
  • नेटवर्क
  • स्थिति (1,0)

इसलिए, जब भी कोई डिवाइस हटा दिया गया/प्रतिस्थापित किया गया हो,
फिर आप स्थिति 0,पर चिह्नित करें इस अपडेट डुप्लिकेट की वजह से छोड़ होगा - निश्चित रूप से , सही सूची पुनर्प्राप्त करने के लिए, status=1 आप अपने अद्यतन बयान के साथ UPDATE IGNORE इस्तेमाल कर सकते हैं की आवश्यकता है

+0

मैंने इस विधि का उपयोग करने के साथ खिलवाड़ किया, और मैंने इसे अतीत में उपयोग किया है, लेकिन मैं इस बार इससे बचने की उम्मीद कर रहा था। नई टेबल संरचना को संभालने के नए तरीके को समायोजित करने के लिए मैं अपने अन्य पृष्ठों/कोड में संशोधन नहीं करना चाहता था। जवाब के लिए धन्यवाद! – JonDoeCA

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