2013-07-19 7 views
8

से अद्यतन के लिए लक्ष्य तालिका 'NAME' निर्दिष्ट नहीं कर सकते हैं। मैं MySQL डीबी में तालिका में अपने डेटा के this समाधान को लागू करने का प्रयास कर रहा हूं जिसमें डुप्लिकेट है। और मुझे ऐसी त्रुटि मिलती है:आप खंड

SQL Error [1093] [HY000]: You can't specify target table 'NAME' for update in FROM clause 


DELETE NAME FROM NAME 
WHERE NAME.id NOT IN 
    (SELECT MIN(id) 
    FROM NAME GROUP BY col1, col2) 

भी उपनाम असाइन करने की कोशिश की - लेकिन सफलता के बिना। इस त्रुटि का क्या कारण है? यह आम तौर पर इंगित करता है कि एसक्यूएल स्क्रिप्ट चक्रीय प्रक्रिया का उत्पादन कर सकती है, लेकिन यहां मैं वास्तव में इसके लिए कोई प्रासंगिक नहीं देखता - यह स्पष्ट है कि DELETE और SELECT के लिए दो चयन अलग-अलग हैं - इंजन को पहलेकरना चाहिए और फिर WHERE स्थितियों में इसका उपयोग करना चाहिए DELETE के लिए। तो - यह त्रुटि क्यों होती है और मैं वास्तव में अपनी तालिका को कैसे डुप्लिकेट कर सकता हूं? =)

+1

आपकी क्वेरी उस समाधान से किसी एक जैसा दिखता है जिसे आप लागू करने का प्रयास कर रहे हैं।वे एक जॉइन का उपयोग करते हैं, जबकि आप 'इन नहीं' का उपयोग कर रहे हैं। – eggyal

+0

@eggyal मेरा लिंक टिप्पणी के लिए इंगित करता है, जवाब नहीं –

+0

आह, काफी उचित; मैंने यह नहीं देखा था। वह टिप्पणी एसक्यूएल सर्वर विशिष्ट है। आपको जवाब में दिए गए शामिल मिलेगा MySQL में काम करेगा। – eggyal

उत्तर

27

आप एक तालिका उपयोग DELETE FROM tablename से रिकॉर्ड को हटाना चाहते हैं यह आप

DELETE FROM NAME 
WHERE NAME.id NOT IN (
        SELECT * FROM ( 
            SELECT MIN(id) FROM NAME GROUP BY col1,col2 
            ) AS p 
        ) 

Read more

+0

@GillBates मेरे अपडेट किए गए उत्तर की जांच करें –

+0

वाह - गैर-स्पष्ट समाधान! इसने काम कर दिया! –

+0

आपका स्वागत है :), अच्छा यह आपके लिए काम करता है! –

0

मदद मिल सकती है की कोशिश करो। आप यहां एक कॉलम निर्दिष्ट नहीं कर सकते हैं। यदि आप कॉलम से डेटा को हटाना चाहते हैं तो कॉलम के मान को खाली या शून्य पर सेट करने के लिए कृपया अद्यतन स्टेटमेंट का उपयोग करें।

3

From the manual:
"वर्तमान में, आप किसी तालिका से हटा नहीं सकते हैं और एक ही तालिका से एक उपखंड में चयन कर सकते हैं।"

उचित डेटाबेस इंजन का उपयोग करें, या अलग से प्रश्नों को चलाएं। हटाने

की sintax (आईडी के प्रोग्राम के रूप में भंडारण के बीच में।)

+0

क्या आप उदाहरण दे सकते हैं? – Tarik

+1

एक उचित डेटाबेस के? PostgreSQL। – aib

-1

कॉलम

का नाम नहीं की आवश्यकता होती है क्योंकि mysql सभी डेटा है कि एक शर्त को पूरा हटाना

4

आपकी क्वेरी सही है और अन्य डीबीएमएस पर काम करेगा, लेकिन MySQL आपको किसी तालिका से अद्यतन या हटाने की अनुमति नहीं देता है और एक ही तालिका से उपकुंजी में चयन करता है। यह आधिकारिक DELETE दस्तावेज़ों पर प्रलेखित है।

यह भविष्य की रिलीज पर तय किया जा सकता है, लेकिन वर्तमान में आपकी क्वेरी समर्थित नहीं है।

एक साधारण ठीक अपने सबक्वेरी echo_Me जवाब में की तरह, एक उप सबक्वेरी में डालने के लिए होगा:

WHERE NAME.id NOT IN (SELECT * FROM (your subquery) s) 

यह आपके सबक्वेरी के परिणामों के साथ एक अस्थायी तालिका बनाने के लिए MySQL के लिए बाध्य करेगा, और आप के बाद से वास्तव में एक ही तालिका से चयन नहीं कर रहे हैं, लेकिन एक अस्थायी तालिका से, यह क्वेरी ठीक चल जाएगी। हालांकि, प्रदर्शन खराब हो सकता है।

आप आमतौर पर जॉइन का उपयोग कर त्रुटि # 1093 से छुटकारा पा सकते हैं।

DELETE NAME 
FROM 
    NAME LEFT JOIN (
    SELECT col1, col2, MIN(id) min_id 
    FROM NAME 
    GROUP BY col1, col2) s 
    ON (NAME.col1, NAME.col2, NAME.id) = (s.col1, s.col2, s.min_id) 
WHERE 
    s.min_id IS NULL 

या आप इस सरल संस्करण है, जो सबसे तेजी से एक होना चाहिए उपयोग कर सकते हैं:

DELETE N1 
FROM 
    NAME N1 INNER JOIN NAME N2 
    ON 
    N1.col1=N2.COL1 
    AND N1.col2=N2.col2 
    AND N1.ID > N2.ID 

फिडल here है यह रूप में शामिल होने में आपकी क्वेरी है।