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'); 但只会返回子查询中的总行数,这不是我想要的。
也许您可以使用结果ANALYZE来创建解决方法。它创建内部模式对象sqlite_stat1
2.6.3. sqlite_stat1 表
sqlite_stat1 是由 ANALYZE 命令创建的内部表,用于保存有关表和索引的补充信息,查询规划器可以使用这些信息来帮助找到执行查询的更好方法。应用程序可以更新、删除、插入或删除 sqlite_stat1 表,但不能创建或更改 sqlite_stat1 表。sqlite_stat1表的架构如下:
Run Code Online (Sandbox Code Playgroud)CREATE TABLE sqlite_stat1(tbl,idx,stat);通常每个索引只有一行,索引由 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)
| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |