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