MySQL टेबल से सभी पंक्तियों को हटा दें और ID को शून्य पर रीसेट करें


183

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

जवाबों:


304

हटाएं नहीं, ट्रंकट का उपयोग करें:

Truncate table XXX

टेबल हैंडलर को अंतिम उपयोग किए गए AUTO_INCREMENT मान याद नहीं है, लेकिन शुरुआत से गिनती शुरू होती है। यह MyISAM और InnoDB के लिए भी सही है, जो आमतौर पर अनुक्रम मानों का पुन: उपयोग नहीं करते हैं।

स्रोत


20
ट्रंचकेट गैर-संकुचित तालिकाओं के साथ अच्छी तरह से काम करता है, लेकिन यदि आपकी तालिका में एक विदेशी कुंजी बाधा है, तो आप डिलीट विधि का उपयोग करने पर विचार कर सकते हैं। इस पोस्ट को देखें यदि आपके पास FK की कमी है: ट्रंककेट विदेशी कुंजी विवश तालिका
जूलियन सोरो

1
याद रखें कि ट्रंकट टेबल रोलबैक में नहीं जा रही है
पेनी चान

83

यदि आप उपयोग नहीं कर सकते हैं TRUNCATE(जैसे कि विदेशी मुख्य बाधाओं के कारण) तो आप स्वतः परिवर्तन को पुनः आरंभ करने के लिए सभी पंक्तियों को हटाने के बाद एक परिवर्तन तालिका का उपयोग कर सकते हैं:

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBggav क्योंकि आप MyISAM के बजाय अपनी टेबल पर InnoDB इंजन का उपयोग कर रहे होंगे, पहली बार अनुक्रमणिका को रीसेट करने का समर्थन नहीं करते।
गुस्तावो रूबियो

Auto_increment value बदलने से पहले सभी पंक्तियों को कैसे हटाया जाए
Kasun Siyambalapitiya

@KasunSiyambalapitiya DELETE FROM tablename;(लेकिन वह अच्छा काम नहीं कर रहा है जब FK बाधाएँ हैं - देखें stackoverflow.com/a/5452798/507761 )
मैथ्यू पढ़ें

17

यदि तालिका में विदेशी कुंजी है तो मैं हमेशा निम्नलिखित कोड का उपयोग करता हूं:

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

लेकिन अंतर निष्पादन समय में होगा। सोरिन के उत्तर के ऊपर देखें।


2
किसी भी तालिका में अनाथ डेटा रखने का यह एक अच्छा तरीका है कि जिस तालिका को आप मिटा रहे हैं, उसके लिए विदेशी कुंजी। तथ्य के बाद विदेशी कुंजी जांच को सक्षम करने से MySQL के कारण उन विदेशी कुंजियों को फिर से अमान्य नहीं किया जा सकता है जहां तक ​​मैं जानता हूं। यह आपको उन पंक्तियों के साथ छोड़ देता है जिनमें डेटा होता है जो संदर्भ तालिका में मौजूद नहीं होता है। आपके पास अपनी मेज पर विदेशी चाबियां भी नहीं हो सकती हैं ।
cimmanon

8

एक रोचक तथ्य।

मुझे यकीन था कि मैं TRUNCATEहमेशा बेहतर प्रदर्शन करूंगा, लेकिन मेरे मामले में, विदेशी कुंजियों वाली लगभग 30 तालिकाओं वाले डेटाबेस के लिए, केवल कुछ पंक्तियों के साथ आबाद, TRUNCATEसभी तालिकाओं के लिए लगभग 12 सेकंड लगे , केवल कुछ सौ मिलीसेकंड के विपरीत DELETE। पंक्तियों। ऑटो इंक्रीमेंट सेट करना कुल मिलाकर लगभग एक सेकंड का है, लेकिन यह अभी भी बहुत बेहतर है।

तो मैं सुझाव दूंगा कि दोनों कोशिश करें, देखें कि आपके मामले के लिए कौन सा काम तेजी से होता है।


2

अगर आप इसका truncateउपयोग करना चाहते हैं :

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