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

时间:2019-05-27 10:00:13

标签: sqlite system.data.sqlite

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

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

从sqlite_master中选择名称,其中type ='table' 并且我想在这样的子查询中使用它:

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

1 个答案:

答案 0 :(得分:0)

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

  

2.6.3。 sqlite_stat1表

     

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

CREATE TABLE sqlite_stat1(tbl,idx,stat);
     

通常每个索引有一行,其中的索引由   sqlite_stat1.idx列中的名称。 sqlite_stat1.tbl列是   索引所属的表的名称。在每一行中   sqlite_stat.stat列将是一个字符串,其中包含   整数,后跟零个或多个参数。这个的第一个整数   list是索引中的大约行数。 (的数量   索引中的行数与表中的行数相同,   除了部分索引。).....

如果没有部分索引,则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;