2011-11-03 16 views
8

तो किसी फ़ील्ड में एक ऑटोइनक्रिकमेंट जोड़ने का प्रयास करते समय यह # 1062 के साथ आता है - कुंजी 1 के लिए डुप्लिकेट प्रविष्टि '1'। मैंने प्राथमिक कुंजी को हटाने और इसे फिर से जोड़ने का प्रयास किया है और यह ठीक काम करता है (जो मुझे लगता है कि डुप्लिकेट नहीं होता है?)# 1062 - कुंजी 1 के लिए डुप्लिकेट प्रविष्टि '1' - कोई डुप्लिकेट प्रविष्टियां नहीं मिलीं

लेकिन जब मैं फ़ील्ड में एक ऑटोइनक्रिकमेंट जोड़ने की कोशिश करता हूं तो यह एक त्रुटि फेंकता है।

SELECT * 
FROM `myTbl` 
WHERE CONCAT_WS("-", 11) = "1" 
ORDER BY 11 
LIMIT 0 , 30 

हालांकि यह एक खाली परिणाम सेट .. सुझाव कोई डुप्लिकेट देखते हैं देता है: यह मुझे जो निम्नलिखित एसक्यूएल चलाता है एक ब्राउज़ विकल्प देता है। तो यदि कोई डुप्लीकेट नहीं है, तो मैं एक ऑटोइनक्रिकमेंट कैसे जोड़ सकता हूं?

+0

'CONCAT_WS ("-", 11)' के परिणाम की आप क्या उम्मीद करते हैं? मुझे हमेशा 11 मिलते हैं ... – glglgl

+0

कृपया 'SHOW CREATE TABLE myTbl' का परिणाम पोस्ट करें और वह आदेश जिसे आप ऑटोइनक्रिकमेंट जोड़ने के लिए उपयोग करते हैं। यह भी ध्यान रखें कि 'CONCAT_WS (' - ', 11) =' 1'' हमेशा 'FALSE' का मूल्यांकन करेगा। आप 'WHERE' खंड में फ़ील्ड के ऑर्डिनल का उपयोग उस तरीके से नहीं कर सकते जिस तरह से आप इसे 'ऑर्डर बाय' में करते हैं। – Quassnoi

+0

तो आपको नहीं लगता कि मैं ditzy हूँ, मैंने एसक्यूएल नहीं लिखा था - यह त्रुटि उत्पन्न करने के बाद ब्राउज़ बटन दबाते समय phpMyAdmin द्वारा उत्पन्न किया गया था। मुझे लगता है कि नीचे पोस्टर (माइकल मोयर) सही है और अब मैं उस समाधान की कोशिश कर रहा हूं। – Ashley

उत्तर

20

क्या आपके पास इस कॉलम के लिए 0 या NULL के साथ कोई पंक्तियां हैं? ALTER TABLE प्राथमिक कुंजी को संशोधित करने का कारण बन सकता है। 0 की कुंजी के मामले में, MySQL इसे मान 1 देने का प्रयास करेगा, जो कुंजी 1 पहले से मौजूद होने पर विफल हो जाएगा।

कॉलम में किसी भी 0 या NULL मानों को कुछ उच्च (और अप्रयुक्त) में बदलने का प्रयास करें।

+0

@Micheal, यदि आप पीके में 0 डालने का प्रयास करते हैं तो क्या होता है SQL-मोड MySQL पर निर्भर करता है। यदि यह पुराने-स्कूल आराम मोड में है, तो यह 1 को प्रतिस्थापित नहीं करेगा, लेकिन अगली ऑटो-वृद्धि प्रदान करेगा। यदि यह अनुशंसित सख्त मोड में है, तो यह '0' डालेगा। – Johan

+0

@ जोहान अच्छा बिंदु। हालांकि, मुझे अभी भी संदेह है कि इससे समस्या हल हो जाएगी। –

+0

यह काम किया - वहां 0 था; धन्यवाद! – Ashley

0
SELECT *       <<-- Select * is an anti-pattern 
FROM myTbl 
WHERE CONCAT_WS("-", 11) = "1" <<-- You are not selecting a column 
ORDER BY 11      <<-- This however does refer to a column. 
LIMIT 30 OFFSET 0 

SELECT field1, field2, field3, ...., field11 
FROM myTbl 
WHERE COALESCE(field1, field2, field3, field11) = '1' 
ORDER BY field11    
LIMIT 30 OFFSET 0 

करने के लिए क्वेरी को फिर से लिखने आप इस तरह एक पंक्ति उपयोग कोड डालने के लिए करना चाहते हैं: आप चयन करना चाहते हैं

INSERT INTO table1 (/*do not list the PK!*/ field2, field3, field4) 
    VALUES ('a', 'test' ,'b' ,'example'); 

सभी डुप्लीकेट पंक्तियों का उपयोग करें:

SELECT id, count(*) as duplicate_count 
FROM table1 
GROUP BY id 
HAVING duplicate_count > 1 

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

एक और विकल्प अतिरिक्त कॉलम जोड़ने और पुराने पीके को छोड़ना है।

ALTER TABLE table1 ADD COLUMN new_id unsigned integer not null auto_increment primary key; 
ALTER TABLE table1 DROP COLUMN id; 
ALTER TABLE table1 CHANGE COLUMN newid id; 
+0

जब तक कि मैं गलतफहमी नहीं कर रहा हूं, समस्या यह है कि ओपी कॉलम में 'ऑटोऑर्डरक्रियामेंट' नहीं जोड़ सकता है। मैं नहीं देखता कि यह कैसे हल करता है। –

2

माइकल मोर का उत्तर काम करता है यदि आप तालिका में डेटा बदल सकते हैं। हालांकि, एक वर्कअराउंड भी है जो आपको डेटा को बरकरार रखने देता है (मैंने इसे MySQL 5.5 पर परीक्षण किया है)। याद रखें कि MySQL में प्राथमिक कुंजी के रूप में शून्य मान होने के कारण इस कारण से अनुशंसित अभ्यास नहीं है। यदि आप शून्य से छुटकारा पा सकते हैं, तो इसे करें।

स्वत: मूल्य पीढ़ी अक्षम जब एक शून्य डाला जाता है:

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; 

अपने स्तंभ के लिए AUTO_INCREMENT जोड़ें:

ALTER TABLE ... AUTO_INCREMENT; 

पुन: सक्षम स्वत: मूल्य पीढ़ी:

SET SQL_MODE=''; 

यह चाहिए स्पष्ट रहें कि इस पूरे ऑपरेशन के दौरान तालिका में डेटा डालने की अनुमति नहीं दी जा सकती है। अन्यथा कॉलम में अवांछित शून्य मान होंगे।

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