MySQL में प्राइमरी की निकालें


182

मेरे पास निम्न तालिका स्कीमा है, जो उपयोगकर्ता Myc डेटाबेस पर अनुमतियों के लिए user_customers को मैप करता है:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

मैं user_customer_id और अनुमति_id के लिए प्राथमिक कुंजी निकालना और आईडी के लिए प्राथमिक कुंजी को बनाए रखना चाहूंगा।

जब मैं कमांड चलाता हूं:

alter table user_customer_permission drop primary key;

मुझे निम्नलिखित त्रुटि मिलती है:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

मैं किसी कॉलम की प्राथमिक कुंजी कैसे छोड़ सकता / सकती हूं?

जवाबों:


286

इंडेक्स के बिना, एक ऑटोइन्क्रिमेंट कॉलम को बनाए रखना बहुत महंगा हो जाता है, इसीलिए MySQLइंडोइक्रेमेंट कॉलम को इंडेक्स के सबसे बाएं हिस्से की आवश्यकता होती है।

कुंजी छोड़ने से पहले आपको ऑटोइन्क्रिमेंट प्रॉपर्टी को हटा देना चाहिए:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

ध्यान दें कि आपके पास एक समग्र है PRIMARY KEYजो सभी तीन स्तंभों को कवर करता है और idअद्वितीय होने की गारंटी नहीं है।

यह अद्वितीय होता है, तो आप इसे एक होने के लिए कर सकते हैं PRIMARY KEYऔर AUTO_INCREMENTफिर से:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

क्या तब मुझे auto_increment प्राथमिक कुंजी के रूप में id कॉलम को पुनर्स्थापित करना होगा? परिवर्तन तालिका user_customer_permission प्राथमिक कुंजी (आईडी) जोड़ें; परिवर्तन तालिका user_customer_permission id आईडी int (11) auto_increment बदलना;
अंकन

@markb: यदि आप प्राथमिक कुंजी को पुनर्स्थापित करते हैं, तो आप यह सुनिश्चित कर सकते हैं कि इसे वापस लौटाया जाए AUTO_INCREMENT
क्वासोनी

इसका मतलब क्या है कि स्वप्रमाणित कॉलम PRIMARY KEY का सबसे बड़ा हिस्सा है। ?
अरूप रक्षित

1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… एक InnoDB तालिका के साथ तंत्र का उपयोग करने के लिए AUTO_INCREMENT, एक AUTO_INCREMENTस्तंभ ai_colको एक सूचकांक के भाग के रूप में परिभाषित किया जाना चाहिए, ताकि अनुक्रमित SELECT MAX(ai_col)लुकअप के बराबर प्रदर्शन करना संभव हो सके अधिकतम स्तंभ मान प्राप्त करने के लिए मेज पर। आमतौर पर, यह स्तंभ को किसी तालिका अनुक्रमणिका का पहला स्तंभ बनाकर प्राप्त किया जाता है।
क्वासोनी

यह कहता है कि PRIMARY परिभाषित नहीं है। ऐसा क्यों होता है? इसलिए मुझे प्राथमिक कुंजी को निर्दिष्ट किए बिना फिर से आईडी कॉलम को हटाना और जोड़ना पड़ा
mrbengi

121

एक पंक्ति:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

आप ऑटो-इंक्रीमेंट भी नहीं खोएंगे और इसे फिर से जोड़ना होगा, जिसके साइड-इफेक्ट्स हो सकते हैं।


5
मुझे लगता है कि इस उत्तर को शीर्ष पर तैरने की आवश्यकता है क्योंकि यह न केवल क्षेत्र की परिभाषा को बदलने की आवश्यकता को दूर करता है, बल्कि यह बदलकर तालिका पर fk बाधाओं के साथ परिवर्तन की अनुमति देता है - वास्तव में मेरी मदद की!
टॉमफब

उत्तम ! मेरे लिए प्राथमिक कुंजी छोड़ने से काम नहीं चला, भले ही मैं ऑटो वेतन वृद्धि से छुटकारा पाने के लिए फ़ील्ड बदल दूं। लेकिन यह समाधान ठीक काम करता है!
user2447161

14

मुझे विश्वास है कि क्वासोई ने आपके प्रत्यक्ष प्रश्न का उत्तर दिया है। बस एक साइड नोट: हो सकता है कि यह आपकी ओर से केवल कुछ अटपटा शब्द हो, लेकिन आप इस धारणा के तहत प्रतीत होते हैं कि आपके पास तीन प्राथमिक कुंजी हैं, प्रत्येक फ़ील्ड पर एक। यह मामला नहीं है। परिभाषा के अनुसार, आपके पास केवल एक प्राथमिक कुंजी हो सकती है। आपके पास यहां एक प्राथमिक कुंजी है जो तीन क्षेत्रों का एक संयुक्त है। इस प्रकार, आप "किसी कॉलम पर प्राथमिक कुंजी को नहीं छोड़ सकते"। आप प्राथमिक कुंजी को छोड़ सकते हैं, या प्राथमिक कुंजी को नहीं छोड़ सकते। यदि आप एक प्राथमिक कुंजी चाहते हैं जिसमें केवल एक कॉलम शामिल है, तो आप मौजूदा प्राथमिक कुंजी को 3 कॉलम पर छोड़ सकते हैं और 1 कॉलम पर एक नई प्राथमिक कुंजी बना सकते हैं।




5

"यदि आप प्राथमिक कुंजी को पुनर्स्थापित करते हैं, तो आप सुनिश्चित करें कि यह वापस AUTO_INCREMENT में वापस आ जाए"

आईडी कॉलम के "पीके संपत्ति को पुनर्स्थापित करने" और "ऑटोइन्क्रॉमेंट संपत्ति को पुनर्स्थापित करने" के लिए यह वांछनीय है या नहीं, इसका कोई सवाल नहीं होना चाहिए।

यह देखते हुए कि यह तालिका की पूर्व परिभाषा में एक स्वत: संचय था, यह काफी संभावना है कि कुछ प्रोग्राम मौजूद हैं जो बिना आईडी मान प्रदान किए इस तालिका में सम्मिलित करते हैं (क्योंकि आईडी कॉलम वैसे भी स्वत: संचय है)।

इस तरह के किसी भी कार्यक्रम का संचालन स्वायत्त संपत्ति को बहाल नहीं करने से टूट जाएगा।


3

सबसे पहले auto_increment फ़ील्ड को हटाने के लिए कॉलम को इस तरह बदलें: तालिका user_customer_permission को संशोधित करें कॉलम आईडी int;

अगला, प्राथमिक कुंजी छोड़ें। परिवर्तन तालिका user_customer_permission drop प्राथमिक कुंजी;



1

मेरे पास एक ही समस्या थी और मेरी तालिका के अंदर कुछ मूल्य थे। हालाँकि मैंने अपनी प्राथमिक कुंजी को बदल दिया है

ALTER TABLEuser_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY (आईडी)

समस्या मेरे सर्वर पर जारी है। मैंने तालिका के अंदर नया क्षेत्र बनाया मैंने मूल्यों को नए क्षेत्र में स्थानांतरित कर दिया और पुराने को हटा दिया, समस्या हल हो गई !!


1

कॉलम में प्राथमिक कुंजी जोड़ने के लिए ।

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

करने के लिए हटाने मेज से प्राथमिक कुंजी।

ALTER TABLE table_name DROP PRIMARY KEY;

0

पहले डेटाबेस का बैकअप लें। फिर तालिका से जुड़ी किसी भी विदेशी कुंजी को छोड़ दें। विदेशी कुंजी तालिका को काटें। वर्तमान तालिका को हटा दें। आवश्यक प्राथमिक कुंजी निकालें। Sqlyog या कार्यक्षेत्र या heidisql या dbeaver या phpmyadmin का उपयोग करें।


0

एसक्यूएल मैनेजर में टेबल को खोजें उसे राइट क्लिक करें और डिज़ाइन का चयन करें, फिर राइट क्लिक करें थोड़ा कुंजी आइकन और प्राथमिक कुंजी को हटाएं चुनें।


यद्यपि यह पोस्ट प्रश्न को हल कर सकती है, स्क्रीनशॉट सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, और उन लोगों को उसी यूआई का पता नहीं हो सकता है जिन्हें आप देख रहे हैं।
पाइरेट एक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.