SQLite में सभी तालिकाओं को छोड़ने का आदेश क्या है?सभी टेबल कमांड
इसी तरह मैं सभी इंडेक्स को छोड़ना चाहता हूं।
SQLite में सभी तालिकाओं को छोड़ने का आदेश क्या है?सभी टेबल कमांड
इसी तरह मैं सभी इंडेक्स को छोड़ना चाहता हूं।
rm db/development.sqlite3
मुझे नहीं लगता कि आप एक हिट में सभी तालिकाओं ड्रॉप कर सकते हैं लेकिन आप आदेशों को प्राप्त करने के लिए निम्न कर सकते हैं:
select 'drop table ' || name || ';' from sqlite_master
where type = 'table';
इस के उत्पादन में एक स्क्रिप्ट है कि आप के लिए टेबल छोड़ देंगे है। इंडेक्स के लिए, बस इंडेक्स के साथ तालिका को प्रतिस्थापित करें।
आप where
अनुभाग में अन्य खंडों का उपयोग कर सकते हैं ताकि सीमाएं या अनुक्रमणिका चयनित हो जाएं (जैसे "0x" "pax_" से शुरू होने वाले लोगों के लिए)।
आप इस स्क्रिप्ट के निर्माण को सरल बैश (या cmd.exe) स्क्रिप्ट में चलाने के साथ जोड़ सकते हैं ताकि चलाने के लिए केवल एक ही आदेश हो।
यदि आपको डीबी में जानकारी के किसी भी पर कोई परवाह नहीं है, तो मुझे लगता है कि आप हार्ड डिस्क से संग्रहीत फ़ाइल को हटा सकते हैं - यह शायद तेज़ है। मैंने कभी इसका परीक्षण नहीं किया है लेकिन मैं नहीं देख सकता कि यह क्यों काम नहीं करेगा।
एक बार जब आप सभी टेबल छोड़ देते हैं (और जब टेबल जाता है तो इंडेक्स गायब हो जाएंगे) तब तक SQLite डेटाबेस में कुछ भी नहीं बचा है, हालांकि फ़ाइल को कम करने लगते हैं (जल्दी से परीक्षण मैंने अभी किया)।
तो फ़ाइल को हटाने से सबसे तेज़ प्रतीत होता है - जब आपका ऐप डीबी फ़ाइल तक पहुंचने का प्रयास करता है तो इसे फिर से बनाया जाना चाहिए।
फ़ाइल कम नहीं होती है क्योंकि यह स्क्लाइट काम नहीं करता है - अगर आप फ़ाइल को खाली करते हैं (मूल रूप से इसे स्क्रैच से पुनर्निर्मित करते हैं) तो यह केवल ओएस पर डिस्क स्थान लौटाएगा। तब तक, फ़ाइल पुन: प्रयोज्य स्थान से भरा है। – paxdiablo
याहू। तो सभी टेबलों को छोड़कर और वैक्यूमिंग समझ में आती है अगर आपके पास फाइल डिलीट/विशेषाधिकार नहीं है, या कुछ अजीब बहु-उपयोगकर्ता स्थिति थी। अन्यथा बस चीज़ को हटा दें? –
हालांकि यह सच है कोई ड्रॉप सभी तालिकाओं कमान आप आदेशों के निम्नलिखित सेट का उपयोग कर सकते नहीं है।
नोट: इन आदेशों भ्रष्ट अपने डेटाबेस की क्षमता है, तो सुनिश्चित करें कि आप एक बैकअप
PRAGMA writable_schema = 1;
delete from sqlite_master where type in ('table', 'index', 'trigger');
PRAGMA writable_schema = 0;
आप तो
VACUUM;
और एक साथ नष्ट कर दिया स्थान को पुनः प्राप्त करना चाहते हैं बनाने के यह सुनिश्चित करने के लिए अच्छा परीक्षण है कि सब ठीक है
PRAGMA INTEGRITY_CHECK;
उन्हें अपग्रेड() में निष्पादित करने के लिए कैसे करें ?? –
बस डीडीएल निष्पादित करें, जो – Noah
है, किसी पागल कारण के मामले में किसी और के पास यह प्रश्न है, उपरोक्त टाइटेनियम मोबाइल के डाटाबेस एपीआई में सभी टेबल ड्रॉप करने के लिए काम करता है। –
मैं अन्य उत्तरों में जोड़ना चाहता हूं जिसमें टेबल छोड़ना और फ़ाइल को हटाना शामिल नहीं है, ताकि आप स्वत: वृद्धि अनुक्रमों को रीसेट करने के लिए delete from sqlite_sequence
निष्पादित भी कर सकें।
मुझे 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);
}
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]))
मैं एंड्रॉयड में इस मुद्दे था और मैं एक विधि यह पश्चिम के लिए इसी तरह लिखा था यहाँ मेरी समाधान है।
क्योंकि मैंने 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();
}
}
मैं यह नहीं कह सकते हैं कि यह सबसे बुलेटप्रूफ या पोर्टेबल समाधान है, लेकिन यह मेरी परीक्षण स्क्रिप्ट के लिए काम करता है:
.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
कोड के इस बिट एक अस्थायी फ़ाइल के लिए उत्पादन पुनर्निर्देश, निर्माण करती है 'ड्रॉप तालिका' आज्ञा देता है कि मैं (अस्थायी फ़ाइल को आदेश भेजने) चलाना चाहते हैं, उत्पादन वापस बाहर मानक करने के लिए सेट है, तो आज्ञाओं को निष्पादित करता है फ़ाइल से, और अंत में फ़ाइल को हटा देता है।
हां, यह डेटाबेस को हटा देता है, लेकिन टेबल के अलावा स्क्लाइट में अन्य चीज भी हो सकती है; विवरण के लिए मेरा पूरा उत्तर देखें – Noah
यदि डेटाबेस में एकाधिक कनेक्शन खुलते हैं, तो यह काम नहीं करेगा। एक * निक्स पर जो नाम को हटा देगा, और कनेक्शन अज्ञात डेटाबेस फ़ाइल के साथ काम करना जारी रखेंगे जब तक कि वे अपने हैंडल बंद न करें। यदि इरादा स्कीमा को फिर से लिखना है (सभी टेबल ड्रॉप करें, नई टेबल बनाएं) तो आप परेशानी में होंगे। – jbarlow
यह स्वीकार्य उत्तर नहीं होना चाहिए, क्योंकि यह डेटाबेस हटा दिया गया है, जिसमें सभी संग्रहित प्रक्रियाएं, ट्रिगर्स इत्यादि शामिल हैं, न केवल टेबल। – Hobbyist