删除SQLite中所有表的命令是什么?
同样,我想删除所有索引。
答案 0 :(得分:74)
我认为您不能在一次点击中删除所有表格,但您可以执行以下操作来获取命令:
select 'drop table ' || name || ';' from sqlite_master
where type = 'table';
这是一个将为您删除表的脚本。对于索引,只需将表替换为索引。
您可以使用where
部分中的其他子句来限制选择哪些表或索引(例如“and name glob 'pax_*'
”,以“pax _”开头。
您可以在简单的bash(或cmd.exe)脚本中将此脚本的创建与其运行结合起来,因此只能运行一个命令。
如果您不关心数据库中任何的信息,我认为您可以删除存储在硬盘中的文件 - 这可能更快。我从未测试过这个,但我不明白为什么它不起作用。
答案 1 :(得分:73)
虽然没有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;
答案 2 :(得分:33)
rm db/development.sqlite3
答案 3 :(得分:22)
我在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);
}
答案 4 :(得分:4)
我想添加其他涉及删除表而不删除文件的答案,您还可以执行delete from sqlite_sequence
来重置自动增量序列。
答案 5 :(得分:3)
使用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]))
答案 6 :(得分:2)
一旦你删除了所有表(并且当表运行时索引将消失)那么据我所知,SQLite数据库中没有任何内容,尽管文件似乎没有缩小(来自快速测试)我已经做了)。
因此删除文件似乎是最快的 - 只应在您的应用程序尝试访问db文件时重新创建它。
答案 7 :(得分:2)
我在Android中遇到过这个问题,我写了一个类似于它的方法。
因为我在表中使用了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();
}
}
答案 8 :(得分: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
这段代码将输出重定向到一个临时文件,构建了&#39; drop table&#39;我想运行的命令(将命令发送到临时文件),将输出设置回标准输出,然后执行文件中的命令,最后删除文件。
答案 9 :(得分:0)
或者在shell提示符下仅假设两行,没有命名的临时文件,假设$ db是SQLite数据库名称:
echo "SELECT 'DROP TABLE ' || name ||';' FROM sqlite_master WHERE type = 'table';" |
sqlite3 -readonly "$db" | sqlite3 "$db"
答案 10 :(得分:0)
要删除视图,添加“视图”关键字:
delete from sqlite_master where type in ('view', 'table', 'index', 'trigger');