sqlite 查询获取所有表名列表以及其中的记录数

Bhu*_*tha 3 sqlite system.data.sqlite

请帮助执行以下查询:sqlite 查询以获取所有表名列表以及其中的记录数:

我想获取 Sqlite3 数据库中每个表的行数。我想避免写出手写查询。我可以获得这样的表列表:

SELECT name FROM sqlite_master WHERE type='table' 我想在子查询中使用它,如下所示:

select count (*) from (SELECT name FROM sqlite_master WHERE type='table'); 但只会返回子查询中的总行数,这不是我想要的。

Din*_*rus 7

也许您可以使用结果ANALYZE来创建解决方法。它创建内部模式对象sqlite_stat1

2.6.3. sqlite_stat1 表

sqlite_stat1 是由 ANALYZE 命令创建的内部表,用于保存有关表和索引的补充信息,查询规划器可以使用这些信息来帮助找到执行查询的更好方法。应用程序可以更新、删除、插入或删除 sqlite_stat1 表,但不能创建或更改 sqlite_stat1 表。sqlite_stat1表的架构如下:

CREATE TABLE sqlite_stat1(tbl,idx,stat);
Run Code Online (Sandbox Code Playgroud)

通常每个索引只有一行,索引由 sqlite_stat1.idx 列中的名称标识。sqlite_stat1.tbl 列是索引所属表的名称。在每个这样的行中,sqlite_stat.stat 列将是一个由整数列表组成的字符串,后跟零个或多个参数。该列表中的第一个整数是索引中的大致行数。(索引的行数与表的行数相同,部分索引除外。).....

如果没有部分索引,SELECT tbl,cast(stat as INT)将返回每个表中的行数,除非表有 0 行。

此 SQL 在小型(25MB、34 个表、26 个索引、33K+ 行)生产数据库上给出了预期结果。您的里程可能(将会?)有所不同。

ANALYZE;
select  DISTINCT tbl_name, CASE WHEN stat is null then 0 else cast(stat as INT) END numrows 
from sqlite_master m 
LEFT JOIN sqlite_stat1 stat on   m.tbl_name = stat.tbl 
where m.type='table'
and m.tbl_name not like 'sqlite_%'
order by 1;
--drop table sqlite_stat1;
Run Code Online (Sandbox Code Playgroud)