查找大型 SQLite 数据库中每个表中的行数



我有一个包含大量表的SQLite数据库。我想找出哪些有零行(并删除它们(。我还没有走多远!我能做的是使用此SQL列出表:

SELECT tbl_name FROM sqlite_master WHERE type = 'table'

SQLite 中有没有办法将其转换为循环并为每个表打印 COUNT(*(?

(注我已经查看了递归公用表表达式 (CTE(,但我看不出它们如何提供帮助。

SQLite 中有没有办法将其转换为循环并打印每个表的 COUNT(*(?

由于 sqlite3的魔力,如果我们允许 sqlite3 是 SQLite 的一部分,答案是肯定的。

无论如何,该技术非常方便。

假设$db是感兴趣的数据库文件:

echo "SELECT 'SELECT count(*), "' || name || '" FROM ' || name || ';'  FROM sqlite_master WHERE type = 'table';" |
sqlite3 -readonly "$db" | sqlite3 -readonly "$db"

对于著名的航班.db数据库,这会产生:

8107|airports
6048|airlines
67663|routes
1|sqlite_stat1
24|sqlite_stat4

调味。

sqlite_stat1 的统计列中的第一个数字是行数。因此,如果您具有写入权限,则:

ANALYZE main;
select * from sqlite_stat1

如果数据库的大小永远不会改变,则只需运行一次 ANALYZE 即可随时运行第二个命令。但是,如果数据库经常更改,则必须重新运行 ANALYZE。

最新更新