त्रुटि 1022 - लिख नहीं सकते; तालिका में डुप्लिकेट कुंजी


218

मैं तालिका कमांड बनाने पर डुप्लिकेट कुंजियों के बारे में 1022 त्रुटि प्राप्त कर रहा हूं। क्वेरी को देखने के बाद, मैं समझ नहीं पा रहा हूं कि दोहराव कहां हो रहा है। क्या कोई और इसे देख सकता है?

SQL query:

-- -----------------------------------------------------
-- Table `apptwo`.`usercircle`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS  `apptwo`.`usercircle` (

 `idUserCircle` MEDIUMINT NOT NULL ,
 `userId` MEDIUMINT NULL ,
 `circleId` MEDIUMINT NULL ,
 `authUser` BINARY NULL ,
 `authOwner` BINARY NULL ,
 `startDate` DATETIME NULL ,
 `endDate` DATETIME NULL ,
PRIMARY KEY (  `idUserCircle` ) ,
INDEX  `iduser_idx` (  `userId` ASC ) ,
INDEX  `idcategory_idx` (  `circleId` ASC ) ,
CONSTRAINT  `iduser` FOREIGN KEY (  `userId` ) REFERENCES  `apptwo`.`user` (
`idUser`
) ON DELETE NO ACTION ON UPDATE NO ACTION ,
CONSTRAINT  `idcategory` FOREIGN KEY (  `circleId` ) REFERENCES  `apptwo`.`circle` (
`idCircle`
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = INNODB;

MySQL said: Documentation

#1022 - Can't write; duplicate key in table 'usercircle' 

4
अगर मुझे सही से याद है, तो प्राथमिक कुंजी हमेशा एक UNIQUE INDEX भी होती है, इसलिए आपको यूनिक इंडेक्स स्टेटमेंट को छोड़ना होगा?
11:47 पर Mr47

1
ON DELETE NO ACTIONबस विदेशी कुंजी के संपूर्ण उपयोग को छोड़ देगा। जब तक आपके पास ऐसा करने के लिए बहुत विशिष्ट कारण न हों।
अमेज़िंगड्राइव

4
@AmazingDreams क्यों? यह अभी भी संदर्भात्मक अखंडता को लागू करता है। केवल आपको स्वयं ही बच्चों को हटाना होगा। यह एक कैस्केड डिलीट से अधिक सुरक्षित है जहां आप गलती से एक गलत कीवर्ड को हटाकर बहुत सारे डेटा को हटा सकते हैं।
GolezTrol

1
stackoverflow.com/a/5810024/1567737 ias अलियास ’का उपयोग करते समय एक उपनाम का उपयोग क्यों उद्देश्य को तुरंत स्पष्ट करता है?
अमेज़िंगड्राइव 5'13

@AmazingDreams टिप के लिए धन्यवाद। मुझे इसके आसपास की बहस पसंद है - यह मुझे पेशेवरों और विपक्षों के बारे में जानने में मदद करता है।
Git-सक्षम

जवाबों:


534

सबसे अधिक संभावना है कि आपके पास पहले से ही नाम iduserया idcategoryआपके डेटाबेस में बाधा है। बस बाधाओं का नाम बदलें यदि ऐसा है तो।

बाधाओं को पूरे डेटाबेस के लिए अद्वितीय होना चाहिए, न कि केवल उस विशिष्ट तालिका के लिए जो आप बना रहे हैं / बदल रहे हैं।

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

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');

15
बिलकुल जैसा आपने कहा। कई अड़चनें ऑटो के क्वेरी के बाकी हिस्सों में समान आइडेसिटरी आइडसर नामों के साथ ऑटो उत्पन्न हुईं - आपकी मदद के लिए धन्यवाद!
गित-सक्षम

1
मुझे लगा कि MySQL वर्कबेन्च ने यह तय किया होगा कि निर्माण स्क्रिप्ट को निर्यात करते समय, लेकिन मुझे "इग्नोर" के लिए जो मिलता है वह इस तरह की चीज़ के बारे में चेतावनी देता है जब मैंने प्रोजेक्ट खोला था।
स्नोइन्फोर्नो

धन्यवाद, दोस्त :) यह मुझे बहुत मदद करता है और अब विदेशी चाबियों के लिए मेरा सम्मेलन अलग है और मैं इस समस्या से दोबारा नहीं मिल सकता :)

इसकी पुष्टि कर सकते हैं। लेकिन नामांकित बाधा मौजूद होने पर मैं क्या कर सकता हूं, हालांकि संदर्भित तालिका पहले ही हटा दी गई थी ?? क्या मैं एक गैर-मौजूदा तालिका से एक बाधा को छोड़ सकता हूं? मुझे लगता है कि मुझे MySQL 5.6 से वर्तमान MariaDB तक अद्यतन करना चाहिए।
अनीस

4
इसके लिए आपको धन्यवाद: बाधाओं को पूरे डेटाबेस के लिए अद्वितीय होना चाहिए
sebasira

31

MySQL में विदेशी कुंजी नाम बदलें। डेटाबेस तालिकाओं में आपके पास समान विदेशी कुंजी नाम नहीं हो सकते।

अपनी सभी तालिकाओं और अपनी सभी विदेशी कुंजियों की जाँच करें और एक ही सटीक नाम के साथ दो विदेशी कुंजियाँ रखने से बचें।


मेरे मामले में यही समस्या थी। मैंने कभी इसका अनुमान नहीं लगाया होगा और आपने मेरा दिन बचाया। अब fk_id_1, fk_id_2 आदि का उपयोग करना। धन्यवाद।
जैकलेइमरदेउर

15

सक्सेसफुल एंड नेमिंग कन्वेंशन नामक दो लिंक से , मैंने आसानी से इसी समस्या का हल किया, जिसका मैंने सामना किया। यानी, विदेशी कुंजी नाम के लिए, fk _colName_ TableName के रूप में दें । यह नामकरण सम्मेलन गैर-अस्पष्ट है और आपके DB मॉडल में प्रत्येक विदेशी को अद्वितीय बनाता है और आपको यह त्रुटि कभी नहीं मिलेगी।

1022 त्रुटि: लिख नहीं सकते; तालिका में डुप्लिकेट कुंजी


6

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

विदेशी प्रमुख बाधाओं के नामकरण के लिए एक अच्छा सम्मेलन है:

fk_TableName_ColumnName

यह जांचने के लिए कि क्या कोई संभावित झड़प है, आप इस क्वेरी के साथ अपने डेटाबेस द्वारा उपयोग की जाने वाली सभी बाधाओं को सूचीबद्ध कर सकते हैं:

SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB';

जब मैंने यह क्वेरी चलाई, मुझे पता चला कि मैंने पहले एक तालिका की एक अस्थायी प्रतिलिपि बनाई थी और यह प्रतिलिपि पहले से ही बाधा नाम का उपयोग कर रही थी जिसे मैं उपयोग करने का प्रयास कर रहा था।


4

मैंने पिछले 4 घंटे उसी मुद्दे के साथ बिताए। मैंने जो किया वह यह सुनिश्चित करने के लिए था कि बाधाओं में अद्वितीय नाम थे।

आप बाधाओं का नाम बदल सकते हैं। मैंने अपने लिए एक नंबर जोड़ा ताकि मैं आसानी से घटित घटनाओं की संख्या का पता लगा सकूं।

उदाहरण

यदि किसी तालिका में एक बाधा का नाम किसी विदेशी कुंजी X के साथ रखा गया है, तो विदेशी कुंजी X के साथ अगला बाधा लड़का 1 कहा जा सकता है

मुझे यकीन है कि आपने मुझसे बेहतर नामों का पता लगाया होगा। 🙂


3

यह पेरकोना टूलकिट के ऑनलाइन-स्कीमा-परिवर्तन टूल के कुछ संस्करणों के बग के संबंध में भी उत्पन्न हो सकता है। एक बड़ी तालिका को म्यूट करने के लिए, pt-osc पहले एक डुप्लिकेट तालिका बनाता है और इसमें सभी रिकॉर्ड को कॉपी करता है। कुछ परिस्थितियों में, पीटी-ओओसी 2.2.x के कुछ संस्करण नए टेबल पर बाधाओं को पुराने टेबल पर बाधाओं के समान नाम देने की कोशिश करेंगे।

2.3.0 में एक फिक्स जारी किया गया था।

अधिक जानकारी के लिए https://bugs.launchpad.net/percona-toolkit/+bug/1498128 देखें ।


1

मुझे उस समस्या का भी सामना करना पड़ा। अगर डेटाबेस का नाम पहले से ही मैसकल में मौजूद है, और पुराने नाम को बदल दें।


1

नई तालिका बनाते समय मुझे यह समस्या थी। यह मेरे द्वारा पहले से दिया गया विदेशी कुंजी नाम बताता है। कुंजी का नाम बदलकर इसे ठीक किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.