mysql - w3schools - ऑटो वृद्धि प्राथमिक कुंजी को पुन: व्यवस्थित/रीसेट करें




mysql w3schools (8)

मेरे पास एक ऑटो वृद्धि प्राथमिक कुंजी के साथ एक MySQL तालिका है। मैंने टेबल के बीच में कुछ पंक्तियां हटा दीं। अब, उदाहरण के लिए, आईडी कॉलम में ऐसा कुछ है: 12, 13, 14, 1 9, 20. मैंने 15, 16, 17 और 18 पंक्तियों को हटा दिया।

मैं प्राथमिक कुंजी को पुन: असाइन / रीसेट / रीडर करना चाहता हूं ताकि मेरे पास निरंतरता हो, यानी 1 9 15, 20 एक 16, और इसी तरह से।

मैं यह कैसे कर सकता हूं?


InnoDB के लिए, ऐसा करें (यह किसी तालिका से सभी रिकॉर्ड्स को हटा देगा, पहले बैककप बनाएं):

SET @[email protected]@CHARACTER_SET_RESULTS ;
SET @[email protected]@COLLATION_CONNECTION ;
SET NAMES utf8 ;
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 ;
SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' ;
SET @[email protected]@SQL_NOTES, SQL_NOTES=0 ;
/* ================================================= */

drop table tablename;
CREATE TABLE `tablename` (
   table structure here!

) ENGINE=InnoDB AUTO_INCREMENT=  ai number to reset  DEFAULT CHARSET= char set here;



/* ================================================= */
SET [email protected]_SQL_MODE ;
SET [email protected]_FOREIGN_KEY_CHECKS ;
SET [email protected]_UNIQUE_CHECKS ;
SET [email protected]_CHARACTER_SET_CLIENT ;
SET [email protected]_CHARACTER_SET_RESULTS ;
SET [email protected]_COLLATION_CONNECTION ;
SET [email protected]_SQL_NOTES ;

आप उस कॉलम की प्राथमिक कुंजी ऑटो वृद्धि कार्यक्षमता को हटा सकते हैं, फिर हर बार जब आप उस कॉलम को अपडेट करते हैं तो हाथ से पहले एक क्वेरी चलाते हैं जो तालिका में सभी पंक्तियों को गिनती है, फिर उस लूप को चलाएं जो उस पंक्ति गणना के माध्यम से प्रत्येक मान को सम्मिलित करता है संबंधित पंक्ति, और आखिरकार उस कॉलम के मूल्य के साथ एक नई पंक्ति डालने में एक क्वेरी चलाएं जो कुल पंक्ति गणना प्लस वन है। यह बेकार ढंग से काम करेगा और आप जो भी कर रहे हैं उसे पूरा करने की कोशिश करने वाले किसी के लिए सबसे पूर्ण समाधान है। यहां कोड का एक उदाहरण दिया गया है जिसका आप फ़ंक्शन के लिए उपयोग कर सकते हैं:

$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("
    SELECT `rank`, `field1`, `field2`, `field3`, `field4`
        FROM (SELECT (@rank:[email protected]+1) as `rank`, `field1`, `field2`, `field3`, `field4`
            FROM (SELECT * FROM `views`) a
            CROSS JOIN (SELECT @rank:=0) b
            ORDER BY rank ASC) c
");
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
    $data[] = $row;
}
foreach ($data as $row) {
    $new_field_1 = (int)$row['rank'];
    $old_field_1 = (int)$row['field1'];
    mysql_query("UPDATE `table` SET `field_1` = $new_field_1 WHERE `field_1` = $old_field_1");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");

यहां मैंने एक सहयोगी सरणी बनाई है जिसे मैंने रैंक कॉलम पर एक चयनित क्वेरी के भीतर क्वेरी के साथ जोड़ा था, जिसने प्रत्येक पंक्ति को रैंक वैल्यू 1 से शुरू किया था। फिर मैंने एसोसिएटिव सरणी के माध्यम से पुनरावृत्ति की।

एक और विकल्प पंक्ति गणना प्राप्त करने के लिए होता है, मूल चयन क्वेरी चलाता है, एसोसिएटिव सरणी प्राप्त करता है और इसे उसी तरह से पुन: सक्रिय करता है लेकिन एक अतिरिक्त चर के साथ जो प्रत्येक पुनरावृत्ति के माध्यम से अद्यतन होता है। यह कम लचीला है लेकिन एक ही चीज़ को पूरा करेगा।

$table_row_count = mysql_result(mysql_query("SELECT COUNT(`field_1`) FROM `table`"), 0);
$viewsrowsdata = mysql_query("SELECT * FROM `table`");
$updated_key = 0;
while ($row = mysql_fetch_assoc($viewsrowsdata)) {
    $data[] = $row;
}
foreach ($data as $row) {
    $updated_key = $updated_key + 1;
    mysql_query("UPDATE `table` SET `field_1` = '$updated_key' WHERE `field_1` = '$row['field_1']'");
}
mysql_query("INSERT INTO `table` (`field1`, `field2`, `field3`, `field4`) VALUES ('$table_row_count' + 1, '$field_2_value', 'field_3_value', 'field_4_value')");

आप प्राथमिक कुंजी कॉलम छोड़ सकते हैं और इसे फिर से बना सकते हैं। सभी आईडी को फिर क्रम में फिर से सौंपना चाहिए।

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


आप बस इस क्वेरी का उपयोग कर सकते हैं

alter table abc auto_increment = 1;

भले ही यह प्रश्न काफी पुराना प्रतीत होता है, फिर भी किसी ऐसे व्यक्ति के लिए उत्तर पोस्ट करेगा जो यहां खोज कर पहुंचता है।

SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;

यदि कॉलम को अन्य तालिकाओं में एक विदेशी कुंजी के रूप में उपयोग किया जाता है, तो सुनिश्चित करें कि आप उन तालिकाओं में विदेशी कुंजी संबंधों के लिए डिफ़ॉल्ट ON UPDATE NO ACTION बजाय ON UPDATE CASCADE उपयोग करें।

इसके अलावा, AUTO_INCREMENT गिनती को रीसेट करने के लिए, आप तुरंत निम्नलिखित कथन जारी कर सकते हैं।

ALTER TABLE `users` AUTO_INCREMENT = 1;

MySQLs के लिए यह मान को MAX(id) + 1 रीसेट कर देगा।


मुझे एक ही संदेह था, लेकिन तालिका में कोई बदलाव नहीं कर सका, मैंने निम्नलिखित आईडी करने का फैसला किया कि मेरी आईडी वैरिएबल @count में निर्धारित अधिकतम संख्या से अधिक नहीं है:

SET @count = 40000000;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;

SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;

ALTER TABLE `users` AUTO_INCREMENT = 1;

समाधान लेता है, लेकिन यह सुरक्षित है और यह आवश्यक था क्योंकि मेरी तालिका में किसी अन्य तालिका में डेटा के साथ विदेशी कुंजी स्वामित्व थी।


या, PhpMyAdmin से, "AutoIncrement" ध्वज हटाएं, सहेजें, इसे फिर से सेट करें और सहेजें। यह इसे रीसेट करता है।


phpmyadmin में

नोट: यह काम करेगा यदि आप पिछली पंक्तियों को मध्य पंक्तियों में नहीं हटाते हैं।

गेटो आपकी टेबल-> ऑपरेशंस मेनू पर क्लिक करें-> गोटो टेबल विकल्प-> उस पर ऑटोऑक्शनक्रिएशन बदलें, जहां से आप शुरू करना चाहते हैं।

आपकी तालिका ऑटोइनक्रिकमेंट उस नंबर से शुरू होती है।

कोशिश करो।





database