मुझे एक तालिका से सभी पंक्तियों को हटाने की आवश्यकता है, लेकिन जब मैं एक नई पंक्ति जोड़ता हूं, तो मुझे प्राथमिक कुंजी आईडी चाहिए, जिसमें एक ऑटो वेतन वृद्धि हो, जो कि 1 से क्रमशः 0 से फिर से शुरू हो।
मुझे एक तालिका से सभी पंक्तियों को हटाने की आवश्यकता है, लेकिन जब मैं एक नई पंक्ति जोड़ता हूं, तो मुझे प्राथमिक कुंजी आईडी चाहिए, जिसमें एक ऑटो वेतन वृद्धि हो, जो कि 1 से क्रमशः 0 से फिर से शुरू हो।
जवाबों:
हटाएं नहीं, ट्रंकट का उपयोग करें:
Truncate table XXX
टेबल हैंडलर को अंतिम उपयोग किए गए AUTO_INCREMENT मान याद नहीं है, लेकिन शुरुआत से गिनती शुरू होती है। यह MyISAM और InnoDB के लिए भी सही है, जो आमतौर पर अनुक्रम मानों का पुन: उपयोग नहीं करते हैं।
स्रोत ।
यदि आप उपयोग नहीं कर सकते हैं TRUNCATE
(जैसे कि विदेशी मुख्य बाधाओं के कारण) तो आप स्वतः परिवर्तन को पुनः आरंभ करने के लिए सभी पंक्तियों को हटाने के बाद एक परिवर्तन तालिका का उपयोग कर सकते हैं:
ALTER TABLE mytable AUTO_INCREMENT = 1
DELETE FROM tablename;
(लेकिन वह अच्छा काम नहीं कर रहा है जब FK बाधाएँ हैं - देखें stackoverflow.com/a/5452798/507761 )
यदि तालिका में विदेशी कुंजी है तो मैं हमेशा निम्नलिखित कोड का उपयोग करता हूं:
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 ;
लेकिन अंतर निष्पादन समय में होगा। सोरिन के उत्तर के ऊपर देखें।
एक रोचक तथ्य।
मुझे यकीन था कि मैं TRUNCATE
हमेशा बेहतर प्रदर्शन करूंगा, लेकिन मेरे मामले में, विदेशी कुंजियों वाली लगभग 30 तालिकाओं वाले डेटाबेस के लिए, केवल कुछ पंक्तियों के साथ आबाद, TRUNCATE
सभी तालिकाओं के लिए लगभग 12 सेकंड लगे , केवल कुछ सौ मिलीसेकंड के विपरीत DELETE
। पंक्तियों। ऑटो इंक्रीमेंट सेट करना कुल मिलाकर लगभग एक सेकंड का है, लेकिन यह अभी भी बहुत बेहतर है।
तो मैं सुझाव दूंगा कि दोनों कोशिश करें, देखें कि आपके मामले के लिए कौन सा काम तेजी से होता है।