SQLite रीसेट प्राथमिक कुंजी फ़ील्ड


118

मेरे पास SQLite में कुछ टेबल हैं और मैं यह समझने की कोशिश कर रहा हूं कि ऑटो-इन्क्रिएटेड डेटाबेस फ़ील्ड को कैसे रीसेट किया जाए।

मैंने पढ़ा है कि DELETE FROM tablenameसबकुछ हटा देना चाहिए और ऑटो-इन्क्रिमेंट फ़ील्ड को वापस रीसेट करना चाहिए 0, लेकिन जब मैं ऐसा करता हूं तो यह डेटा को हटा देता है। जब एक नया रिकॉर्ड डाला जाता है, तो ऑटोइनक्रीमेंट पिक हो जाता है, जहां इसे डिलीट करने से पहले छोड़ दिया जाता है।

मेरे identक्षेत्र गुण इस प्रकार हैं:

  • फ़ील्ड प्रकार :integer
  • फील्ड झंडे : PRIMARY KEY, AUTOINCREMENT,UNIQUE

क्या यह मायने रखता है कि मैंने SQLite Maestro में तालिका बनाई है और मैं DELETESQLite Maestro में भी कथन को निष्पादित कर रहा हूं ?

कोई भी मदद बहुत अच्छी रहेगी।

जवाबों:


244

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

delete from your_table;    
delete from sqlite_sequence where name='your_table';

SQLite ऑटोइन्क्रिमेंट

SQLite सबसे बड़ी ROWID का ट्रैक रखता है जिसे किसी टेबल ने कभी विशेष SQLITE_SEQUENCEटेबल का उपयोग करके रखा है । SQLITE_SEQUENCEटेबल बनाया है और स्वचालित रूप से प्रारंभ जब भी एक सामान्य तालिका है कि एक autoincrement स्तंभ शामिल बनाई गई है है। SQLITE_SEQUENCE तालिका की सामग्री को साधारण अद्यतन, INSERT और DELETE कथनों का उपयोग करके संशोधित किया जा सकता है। लेकिन इस तालिका में संशोधन करने से AUTOINCREMENT प्रमुख पीढ़ी के एल्गोरिथ्म का खतरा बढ़ जाएगा। सुनिश्चित करें कि आप जानते हैं कि इस तरह के बदलाव करने से पहले आप क्या कर रहे हैं।


9
बस एक छोटा सा साइड नोट: टेबल का नाम जहां क्लॉज संवेदनशील है
201 बजे 321X

5
दूसरा तरीका sqlite_fterence तालिका अपडेट कर रहा है। अद्यतन sqlite_fterence सेट seq = 0 जहां नाम = '<tablename>' यह sqlite_fterence तालिका की पंक्ति को रीसेट नहीं करेगा।
बाइनरी

@ चिकित्सा, एक वैकल्पिक तरीके का उल्लेख करने के लिए धन्यवाद :) मैं यह नोट करना चाहूंगा कि SQLite "हटाए गए" स्थान का पुन: उपयोग करता है, इसलिए यह वास्तव में बहुत अंतर नहीं करता है कि हम कौन सा समाधान चुनेंगे।
निक डंडौलकिस

1
ध्यान दें कि जब आप एक ऑटोइनक्रीमेंट कॉलम को परिभाषित करते हैं तो SQLite sqlite_fterence टेबल बनाता है। यह पहले मौजूद नहीं है।
ज़ाचरी येट्स

@ZacharyYates, वास्तव में, लेकिन यह पहले ही उद्धृत पाठ पर उल्लिखित है।
निक डंडौलकिस

48

आप अपनी तालिका में हटाए गए पंक्तियों के बाद अपडेट अनुक्रम द्वारा रीसेट कर सकते हैं

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';

क्या आप मुझे बता सकते हैं कि कमरे के लिए यह कैसे करना है?
साइको

आपका क्या मतलब है @ साइको? मैं समझ नहीं पा रहा हूँ :)
Huọnh Ngọc Bang

वास्तव में मैं पूछ रहा था कि यह कैसे कक्ष डेटाबेस में किया जाता है ..... अच्छी तरह से अब के लिए समस्या हल हो गई है
साइको

@ साइको आपको बता सकता है कि आपने कमरे के डेटाबेस का उपयोग कैसे किया?
प्रकाशपुन

1

वैकल्पिक विकल्प के रूप में, यदि आपके पास Sqlite डेटाबेस ब्राउज़र है और GUI समाधान के लिए अधिक इच्छुक हैं, तो आप sqlite_fterence तालिका को संपादित कर सकते हैं जहाँ फ़ील्ड का नाम आपकी तालिका का नाम है। फ़ील्ड seq के लिए सेल पर डबल क्लिक करें और डायलॉग बॉक्स में 0 पर मान को पॉप अप करें।


0

यदि आप सामग्री प्रदाता के माध्यम से प्रत्येक RowId को रीसेट करना चाहते हैं, तो यह प्रयास करें

rowCounter=1;
do {            
            rowId = cursor.getInt(0);
            ContentValues values;
            values = new ContentValues();
            values.put(Table_Health.COLUMN_ID,
                       rowCounter);
            updateData2DB(context, values, rowId);
            rowCounter++;

        while (cursor.moveToNext());

public static void updateData2DB(Context context, ContentValues values, int rowId) {
    Uri uri;
    uri = Uri.parseContentProvider.CONTENT_URI_HEALTH + "/" + rowId);
    context.getContentResolver().update(uri, values, null, null);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.