2009-02-08 14 views
69

SQLite में सभी तालिकाओं को छोड़ने का आदेश क्या है?सभी टेबल कमांड

इसी तरह मैं सभी इंडेक्स को छोड़ना चाहता हूं।

उत्तर

27
rm db/development.sqlite3 
+0

हां, यह डेटाबेस को हटा देता है, लेकिन टेबल के अलावा स्क्लाइट में अन्य चीज भी हो सकती है; विवरण के लिए मेरा पूरा उत्तर देखें – Noah

+7

यदि डेटाबेस में एकाधिक कनेक्शन खुलते हैं, तो यह काम नहीं करेगा। एक * निक्स पर जो नाम को हटा देगा, और कनेक्शन अज्ञात डेटाबेस फ़ाइल के साथ काम करना जारी रखेंगे जब तक कि वे अपने हैंडल बंद न करें। यदि इरादा स्कीमा को फिर से लिखना है (सभी टेबल ड्रॉप करें, नई टेबल बनाएं) तो आप परेशानी में होंगे। – jbarlow

+2

यह स्वीकार्य उत्तर नहीं होना चाहिए, क्योंकि यह डेटाबेस हटा दिया गया है, जिसमें सभी संग्रहित प्रक्रियाएं, ट्रिगर्स इत्यादि शामिल हैं, न केवल टेबल। – Hobbyist

72

मुझे नहीं लगता कि आप एक हिट में सभी तालिकाओं ड्रॉप कर सकते हैं लेकिन आप आदेशों को प्राप्त करने के लिए निम्न कर सकते हैं:

select 'drop table ' || name || ';' from sqlite_master 
    where type = 'table'; 

इस के उत्पादन में एक स्क्रिप्ट है कि आप के लिए टेबल छोड़ देंगे है। इंडेक्स के लिए, बस इंडेक्स के साथ तालिका को प्रतिस्थापित करें।

आप where अनुभाग में अन्य खंडों का उपयोग कर सकते हैं ताकि सीमाएं या अनुक्रमणिका चयनित हो जाएं (जैसे "0x" "pax_" से शुरू होने वाले लोगों के लिए)।

आप इस स्क्रिप्ट के निर्माण को सरल बैश (या cmd.exe) स्क्रिप्ट में चलाने के साथ जोड़ सकते हैं ताकि चलाने के लिए केवल एक ही आदेश हो।

यदि आपको डीबी में जानकारी के किसी भी पर कोई परवाह नहीं है, तो मुझे लगता है कि आप हार्ड डिस्क से संग्रहीत फ़ाइल को हटा सकते हैं - यह शायद तेज़ है। मैंने कभी इसका परीक्षण नहीं किया है लेकिन मैं नहीं देख सकता कि यह क्यों काम नहीं करेगा।

+0

धन्यवाद। बहुत अजीब बात है कि कोई आसान कमांड नहीं है बल्कि इसके हैकी एसक्यूएल क्वेरी है। – alamodey

+5

ठीक है, खाली स्क्लाइट डेटाबेस प्राप्त करने का सबसे आसान तरीका सिर्फ फ़ाइल को हटाना है, और उसके बाद कनेक्ट करें .. –

+2

इसलिए मेरा अंतिम पैराग्राफ, @ जेएफ। – paxdiablo

2

एक बार जब आप सभी टेबल छोड़ देते हैं (और जब टेबल जाता है तो इंडेक्स गायब हो जाएंगे) तब तक SQLite डेटाबेस में कुछ भी नहीं बचा है, हालांकि फ़ाइल को कम करने लगते हैं (जल्दी से परीक्षण मैंने अभी किया)।

तो फ़ाइल को हटाने से सबसे तेज़ प्रतीत होता है - जब आपका ऐप डीबी फ़ाइल तक पहुंचने का प्रयास करता है तो इसे फिर से बनाया जाना चाहिए।

+1

फ़ाइल कम नहीं होती है क्योंकि यह स्क्लाइट काम नहीं करता है - अगर आप फ़ाइल को खाली करते हैं (मूल रूप से इसे स्क्रैच से पुनर्निर्मित करते हैं) तो यह केवल ओएस पर डिस्क स्थान लौटाएगा। तब तक, फ़ाइल पुन: प्रयोज्य स्थान से भरा है। – paxdiablo

+0

याहू। तो सभी टेबलों को छोड़कर और वैक्यूमिंग समझ में आती है अगर आपके पास फाइल डिलीट/विशेषाधिकार नहीं है, या कुछ अजीब बहु-उपयोगकर्ता स्थिति थी। अन्यथा बस चीज़ को हटा दें? –

63

हालांकि यह सच है कोई ड्रॉप सभी तालिकाओं कमान आप आदेशों के निम्नलिखित सेट का उपयोग कर सकते नहीं है।

नोट: इन आदेशों भ्रष्ट अपने डेटाबेस की क्षमता है, तो सुनिश्चित करें कि आप एक बैकअप

PRAGMA writable_schema = 1; 
delete from sqlite_master where type in ('table', 'index', 'trigger'); 
PRAGMA writable_schema = 0; 

आप तो

VACUUM; 

और एक साथ नष्ट कर दिया स्थान को पुनः प्राप्त करना चाहते हैं बनाने के यह सुनिश्चित करने के लिए अच्छा परीक्षण है कि सब ठीक है

PRAGMA INTEGRITY_CHECK; 
+1

उन्हें अपग्रेड() में निष्पादित करने के लिए कैसे करें ?? –

+0

बस डीडीएल निष्पादित करें, जो – Noah

+0

है, किसी पागल कारण के मामले में किसी और के पास यह प्रश्न है, उपरोक्त टाइटेनियम मोबाइल के डाटाबेस एपीआई में सभी टेबल ड्रॉप करने के लिए काम करता है। –

4

मैं अन्य उत्तरों में जोड़ना चाहता हूं जिसमें टेबल छोड़ना और फ़ाइल को हटाना शामिल नहीं है, ताकि आप स्वत: वृद्धि अनुक्रमों को रीसेट करने के लिए delete from sqlite_sequence निष्पादित भी कर सकें।

21

मुझे SQLite और Android के साथ एक ही समस्या थी।

List<String> tables = new ArrayList<String>(); 
Cursor cursor = db.rawQuery("SELECT * FROM sqlite_master WHERE type='table';", null); 
cursor.moveToFirst(); 
while (!cursor.isAfterLast()) { 
    String tableName = cursor.getString(1); 
    if (!tableName.equals("android_metadata") && 
      !tableName.equals("sqlite_sequence")) 
     tables.add(tableName); 
    cursor.moveToNext(); 
} 
cursor.close(); 

for(String tableName:tables) { 
    db.execSQL("DROP TABLE IF EXISTS " + tableName); 
} 
2

pysqlite का उपयोग करना::

tables = list(cur.execute("select name from sqlite_master where type is 'table'")) 

cur.executescript(';'.join(["drop table if exists %s" %i for i in tables])) 
1

मैं एंड्रॉयड में इस मुद्दे था और मैं एक विधि यह पश्चिम के लिए इसी तरह लिखा था यहाँ मेरी समाधान है।

क्योंकि मैंने AUTOINCREMENT मेरी टेबल में प्राथमिक कुंजी का उपयोग किया था, sqlite_sequence नामक एक तालिका थी। नियमित रूप से उस तालिका को छोड़ने का प्रयास करते समय SQLite क्रैश हो जाएगा। मैं अपवाद भी नहीं पकड़ सका।https://www.sqlite.org/fileformat.html#internal_schema_objects पर देखकर, मैंने सीखा कि इनमें से कई आंतरिक स्कीमा टेबल हो सकते हैं जिन्हें मैं छोड़ना नहीं चाहता था। प्रलेखन का कहना है कि इन तालिकाओं में से किसी के नाम sqlite_ के साथ शुरुआत की है तो मैं इस विधि लिखा

private void dropAllUserTables(SQLiteDatabase db) { 
    Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); 
    //noinspection TryFinallyCanBeTryWithResources not available with API < 19 
    try { 
     List<String> tables = new ArrayList<>(cursor.getCount()); 

     while (cursor.moveToNext()) { 
      tables.add(cursor.getString(0)); 
     } 

     for (String table : tables) { 
      if (table.startsWith("sqlite_")) { 
       continue; 
      } 
      db.execSQL("DROP TABLE IF EXISTS " + table); 
      Log.v(LOG_TAG, "Dropped table " + table); 
     } 
    } finally { 
     cursor.close(); 
    } 
} 
0

मैं यह नहीं कह सकते हैं कि यह सबसे बुलेटप्रूफ या पोर्टेबल समाधान है, लेकिन यह मेरी परीक्षण स्क्रिप्ट के लिए काम करता है:

.output /tmp/temp_drop_tables.sql 
select 'drop table ' || name || ';' from sqlite_master where type = 'table'; 
.output stdout 
.read /tmp/temp_drop_tables.sql 
.system rm /tmp/temp_drop_tables.sql 

कोड के इस बिट एक अस्थायी फ़ाइल के लिए उत्पादन पुनर्निर्देश, निर्माण करती है 'ड्रॉप तालिका' आज्ञा देता है कि मैं (अस्थायी फ़ाइल को आदेश भेजने) चलाना चाहते हैं, उत्पादन वापस बाहर मानक करने के लिए सेट है, तो आज्ञाओं को निष्पादित करता है फ़ाइल से, और अंत में फ़ाइल को हटा देता है।

संबंधित मुद्दे