MySQL तालिका में प्राथमिक कुंजी कैसे जोड़ें?


103

यह वही है जो मैंने कोशिश की, लेकिन यह विफल है:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

क्या किसी के पास कोई टिप है?


11
जब कुछ विफल हो जाता है , तो यह निर्दिष्ट करने के लिए हमेशा एक अच्छा विचार है कि विफल होने का क्या मतलब है: क्या आपको एक त्रुटि संदेश मिलता है? कौनसा ?
पास्कल मार्टिन

मुझे लगता है कि त्रुटि संदेश ऐसा लगता है: एकाधिक प्राथमिक कुंजी परिभाषित
LMD

जवाबों:


226

स्तंभ जोड़ने के बाद, आप हमेशा प्राथमिक कुंजी जोड़ सकते हैं:

ALTER TABLE goods ADD PRIMARY KEY(id)

जैसा कि आपकी स्क्रिप्ट काम नहीं कर रही थी, आपको PRIMARY KEYकेवल शब्द ही नहीं, निर्दिष्ट करने की आवश्यकता है PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

मेरे लिए यह कहता है: यह कई प्राथमिक कुंजियों को परिभाषित करेगा। Im InnoDB का उपयोग कर। नोट मेरे पास पहले से ही 3 हैं।
LMD

2
मैं निश्चित रूप से डाल FIRSTके बाद AUTO_INCREMENT, जो इसका मतलब है, कि idपहले से ही विद्यमान तालिका के पहले कॉलम किया जाएगा। अन्यथा इसे तालिका के अंत में रखा जाएगा जैसा कि अभी लिखा गया है, जो कि सरल करते समय थोड़ा भ्रमित हो सकता हैSELECT * ...
StefanK

नए 'आईडी' कॉलम में पहला स्थान कैसे प्राप्त करें
टिपवाइजर

17

मौजूदा स्तंभ

यदि आप किसी मौजूदा स्तंभ में प्राथमिक कुंजी बाधा जोड़ना चाहते हैं, तो पहले से सूचीबद्ध सभी वाक्यविन्यास विफल हो जाएंगे।

मौजूदा स्तंभ में प्राथमिक कुंजी बाधा जोड़ने के लिए फ़ॉर्म का उपयोग करें:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
mysql MODIFY को उचित कथन (कम से कम XAMPP, InnoDB में) के रूप में नहीं पहचानता
LMD

@LMD आप पर mysql का कौन सा संस्करण है? (नोट: मुझे पता है कि यह उस समय काम किया था जब मैंने इसे पोस्ट किया था और मेरा मानना ​​है कि यह 5.6 था ... लेकिन मैं निश्चित रूप से याद नहीं रख सकता)
MER

1
यदि आप मेरे लिए पसंद करते हैं, तो यह MODIFY को CHANGE से रिप्लेस नहीं करता है और यह काम करेगा!
csr-nontol

12

यदि आपकी तालिका काफी बड़ी है तो कथन का उपयोग न करें:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

क्योंकि यह एक अस्थायी तालिका में सभी डेटा की एक प्रति बनाता है, तालिका में परिवर्तन करता है और फिर इसे वापस कॉपी करता है। बेहतर यह मैन्युअल रूप से करते हैं। अपनी तालिका का नाम बदलें:

rename table goods to goods_old;

प्राथमिक कुंजी और सभी आवश्यक अनुक्रमित के साथ नई तालिका बनाएं:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

पुराने तालिका से सभी डेटा को स्थानांतरित करें, कॉपी करने में तेजी लाने के लिए कुंजी और अनुक्रमित को अक्षम करें:

- MyISAM टैब के लिए इस का उपयोग करें :

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

या

- InnoDB टैब के लिए इस का उपयोग करें :

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

~ 200 mln पंक्तियों वाली तालिका में PK को जोड़ने के लिए 2 000 सेकंड लगते हैं।


मुझे आश्चर्य हुआ कि मुझे इस उत्तर को खोजने के लिए कितने समय तक खोज करने की आवश्यकता थी। इन सहायक उदाहरणों के लिए धन्यवाद।
रयान

4

यकीन नहीं होता कि यह किसी और के लिए है, लेकिन मैं डेटाबेस में पहले कॉलम के लिए आईडी तालिका पसंद करता हूं। इसके लिए वाक्य रचना है:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

जो कि पहले उत्तर पर बस थोड़ा सा सुधार है। यदि आप चाहते थे कि यह एक अलग स्थिति में हो, तो

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, -ft





0

इसे इस्तेमाल करे,

alter table goods add column `id` int(10) unsigned primary key auto_increment

0

मेरे लिए, किसी भी सुझाव ने मुझे वाक्य रचना की त्रुटियों को देने का काम नहीं किया, इसलिए मैंने बस phpmyadmin (संस्करण 4.9.2), (10.4.10-MariaDB) का उपयोग करके एक प्रयास दिया और idऑटो-इंक्रीमेंट प्राथमिक कुंजी के साथ कॉलम जोड़ा । Idस्तंभ को पहले तत्व से अच्छी तरह से जोड़ा गया था।

क्वेरी आउटपुट था:

ALTER तालिका table_nameजोड़ें idINT नहीं NULL AUTO_INCREMENT सबसे पहले, प्राथमिक कुंजी (ADD id);


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