मौजूदा तालिका में स्वतः वृद्धि प्राथमिक कुंजी डालें


157

मैं एक ऐसी मेज को बदलने की कोशिश कर रहा हूं जिसमें कोई प्राथमिक कुंजी नहीं है और न ही auto_increment कॉलम है। मुझे पता है कि प्राथमिक कुंजी स्तंभ कैसे जोड़ा जाता है, लेकिन मैं सोच रहा था कि क्या स्वचालित रूप से प्राथमिक कुंजी स्तंभ में डेटा सम्मिलित करना संभव है (मेरे पास पहले से ही DB में 500 पंक्तियाँ हैं और उन्हें आईडी देना चाहता हूं लेकिन मैं इसे मैन्युअल रूप से नहीं करना चाहता) । कोई विचार? बहुत बहुत धन्यवाद।


2
आप आसानी alter tableसे कुंजी को जोड़ने के लिए कर सकते हैं , लेकिन MySQL उन क्षेत्रों के लिए आईडी उत्पन्न नहीं करेगा जिनके पास पहले से नहीं है। आपको मौजूदा फ़ील्ड को मैन्युअल रूप से अपडेट करना होगा और फिर सुनिश्चित करें कि आपका नया auto_increment सही ऑफ़सेट पर शुरू होता है - यह '1' के लिए डिफॉल्ट करता है और आप किसी भी तरह डुप्लिकेट मुख्य त्रुटियों को समाप्त करेंगे।
मार्क बी

3
@MarcB मैंने अभी-अभी परीक्षण किया है, और इसने 1 से शुरू होने वाली मौजूदा पंक्तियों के लिए आईडी सम्मिलित किया है
माइकल बर्कोव्स्की

जवाबों:


253

मेरे परीक्षण में कॉलम ALTER TABLEजोड़ने का एक कथन PRIMARY KEYसही ढंग से काम करता है:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

परीक्षण प्रयोजनों के लिए बनाई गई एक अस्थायी तालिका में, उपरोक्त कथन ने AUTO_INCREMENT idकॉलम बनाया और तालिका में प्रत्येक मौजूदा पंक्ति के लिए ऑटो-इंक्रीमेंट मान डाला, जो 1 से शुरू होता है।


1
हां, यह मेरा अनुभव रहा है। Auto_increment ids को पॉपुलेट करने के लिए कभी भी अलग स्क्रिप्ट चलाने की याद नहीं ...
माइक पर्सल

1
बहुत ज़ोर से हँसते हुए धन्यवाद। मेरी गलती। हरे रंग का चिह्न आपके लिए तब से है जब आपका लागू करना आसान है। : डी
फ्लाइंगकैट

53
इसे पहला कॉलम बनाने के लिए, FIRSTउदाहरण के लिएALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
डेविड थॉमस

1
@ निक्की SQLite के मैकेनिक्स काफी अलग हैं। आप यहां सुझाव प्राप्त करेंगे stackoverflow.com/questions/946011/sqlite-add-primary-key
माइकल बर्कोव्स्की

1
@WijaySharma यदि आपने पंक्ति को ऑटो-इंक्रीमेंट के साथ बनाया है और इसे तुरंत आईडी द्वारा प्राप्त करना होगा, तो MySQL LAST_INSERT_ID()उस मूल्य के लिए ऑफ़र करता है SELECT * FROM table_name WHERE id = LAST_INSERT_ID()और अधिकांश प्रोग्रामिंग भाषा एपीआई आवेदन कोड में उस मान को वापस करने के लिए कुछ फ़ंक्शन / विधि प्रदान करते हैं।
माइकल बर्कोव्स्की

51

मान लें कि आपके पास id, नहीं, जैसे ऑटो वेतन वृद्धि के लिए कॉलम नहीं है, तो आप निम्नलिखित क्वेरी का उपयोग करके जोड़ सकते हैं:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

यदि आपने कॉलम किया है, तो निम्नलिखित क्वेरी का उपयोग करके ऑटो इंक्रीमेंट में परिवर्तन करें:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

1
FIRSTअंत में क्या करता है?
देहाती

1
यह नए idकॉलम को तालिका में पहला बना देगा , जो कि अंतिम के विपरीत है, जो कि डिफ़ॉल्ट व्यवहार है।
फेमिलीना

अच्छा काम कर रहा है! धन्यवाद!
माजिदुर रहमान

4

हां, ऐसा कुछ होगा, यह सबसे अच्छा नहीं हो सकता है, फिर भी आप एक बैकअप बनाना चाहते हैं

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

ध्यान दें कि any_fieldअपडेट करते समय आपके द्वारा चुना गया समान होना चाहिए।


4

अपने आप जैसे उन लोगों के लिए जो एक Multiple primary key definedत्रुटि की कोशिश कर रहे हैं:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

MySQL v5.5.31 पर इसने idकॉलम को मेरे लिए प्राथमिक कुंजी के रूप में सेट किया और प्रत्येक पंक्ति को एक वर्धित मान के साथ आबाद किया।


2

मुझे सबसे आसान और तेज लगता है

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);

2

मैं इन निर्देशों को एक मौजूदा गैर-वेतन वृद्धि प्राथमिक कुंजी के साथ तालिका लेने में सक्षम करने में सक्षम था , और तालिका में एक वृद्धिशील प्राथमिक कुंजी जोड़ सकता हूं और निम्नलिखित का उपयोग करके समग्र प्राथमिक कुंजी के रूप में पुरानी और नई कुंजी दोनों के साथ एक नई समग्र प्राथमिक कुंजी बना सकता हूं कोड:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

जब यह किया जाता है, तो _USER_ID फ़ील्ड मौजूद होती है और आपके पास प्राथमिक कुंजी के लिए सभी नंबर मान होते हैं, जैसा कि आप अपेक्षा करते हैं। शीर्ष पर "डीआरओपी टेबल" के साथ, आप विविधताओं के साथ प्रयोग करने के लिए इसे बार-बार चला सकते हैं।

मैं जो काम नहीं कर पाया, वह ऐसी स्थिति है, जहां आने वाले फॉरेक्स कुंजी हैं जो पहले से ही USER_ID फ़ील्ड पर इंगित करते हैं। मुझे यह संदेश तब मिलता है जब मैं किसी अन्य तालिका से आने वाली विदेशी कुंजी के साथ अधिक जटिल उदाहरण करने की कोशिश करता हूं।

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

मैं अनुमान लगा रहा हूं कि मुझे ALTER टेबल करने से पहले सभी विदेशी चाबियों को फाड़ना होगा और फिर बाद में उन्हें फिर से बनाना होगा। लेकिन अभी के लिए मैं इस समाधान को मूल प्रश्न के अधिक चुनौतीपूर्ण संस्करण में साझा करना चाहता था, जब अन्य इस स्थिति में भाग गए थे।


0

अपनी तालिका निर्यात करें, फिर अपनी तालिका खाली करें, फिर फ़ील्ड को विशिष्ट INT के रूप में जोड़ें, फिर इसे AUTO_INCREMENT में बदलें, फिर अपनी तालिका को फिर से आयात करें जिसे आपने पहले निर्यात किया था।


0

आप मौजूदा तालिका में एक नया प्राथमिक कुंजी स्तंभ जोड़ सकते हैं, जिसमें कमांड संख्याएं हो सकती हैं, कमांड का उपयोग कर:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828

0

मैं उसी समस्या का सामना कर रहा था, इसलिए मैंने जो कुछ किया वह मैंने प्राथमिक कुंजी के लिए छोड़ दिया था, फिर मैंने इसे फिर से बनाया और सुनिश्चित किया कि यह ऑटो इंक्रीमेंटल है। मेरे लिए वह काम कर गया। मुझे उम्मीद है कि यह दूसरों की मदद करता है


0

ALTER तालिका TableName संशोधित tableNameID MEDIUMINT नहीं NULL AUTO_INCREMENT ;

यहाँ TableName अपनी मेज का नाम है,

तालिका नाम आपके स्तंभ का नाम है जिसे प्राथमिक रूप से संशोधित किया जाना है

MEDIUMINT आपकी मौजूदा प्राथमिक कुंजी का डेटा प्रकार है

AUTO_INCREMENT आपको शून्य नहीं होने के बाद सिर्फ auto_increment जोड़ना है

यह कि प्राथमिक कुंजी auto_increment कर देगा ......

आशा है कि यह उपयोगी है :)


1
यदि आप इसे संपादित करते हैं और कुछ स्पष्टीकरण जोड़ते हैं तो यह उपयोगी होगा ।
शशांत

-1

पहले से मौजूद फ़ील्ड (नाम, इस उदाहरण में) को प्राथमिक कुंजी बनाने के लिए PHP को कैसे लिखें? डब्ल्यू / ओ, निश्चित रूप से, तालिका में किसी भी अतिरिक्त 'आईडी' फ़ील्ड को जोड़ते हुए।

यह तालिका वर्तमान में बनाई गई है - रिकॉर्ड की संख्या मिली: 4 नाम VARCHAR (20) YES VARCHAR (30) YES रंग VARCHAR (20) YES वजन SMALLINT (7) YES

यह अंतिम परिणाम मांगा गया (टेबल विवरण) -

पाया रिकॉर्ड की संख्या: 4 नाम VARCHAR (20) कोई PRI नस्ल VARCHAR (30) हाँ रंग VARCHAR (20) हाँ वजन SMALLINT (7) YES

इसके बदले -

अभिलेखों की संख्या में पाया गया: 5 आईडी इंट (11) NO PRI नाम VARCHAR (20) YES नस्ल VARCHAR (30) YES रंग VARCHAR (20) YES वजन SMALLINT (7) YES

कोशिश करने के बाद ..

$ क्वेरी = "अतिरिक्त टैब्लेट घोड़ों के एडीडी आईडी नॉट नॉट ऑटोऑनक्रिमेंट एफआईआरएसटी, एडीआर प्राथमिक कुंजी (आईडी)";

इसको कैसे लें? -

पाया रिकॉर्ड की संख्या: 4 नाम VARCHAR (20) कोई PRI नस्ल VARCHAR (30) हाँ रंग VARCHAR (20) हाँ वजन SMALLINT (7) YES

यानी INSERT / ADD .. आदि प्राथमिक कुंजी पहले फील्ड रिकॉर्ड (w / o में एक अतिरिक्त 'आईडी' फ़ील्ड जोड़ते हैं, जैसा कि पहले कहा गया है।

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