通过子查询标识的表的行数统计sqlite

9

我想要在Sqlite3数据库中获取每张表的行数。我希望避免写出冗长的查询语句。我可以像这样获取表列表:

SELECT name FROM sqlite_master WHERE type='table'

我想在子查询中使用它,就像这样:

select count (*) from (SELECT name FROM sqlite_master WHERE type='table');

但是这样只会返回子查询中的总行数,这不是我想要的。

我该如何编写一个查询,以列出每个表及其计数?

我已经看到过用于此类事情的动态SQL,但我不认为SQLite有它。

我已经编写了一个bash循环来完成这个任务,但我更愿意将其作为一个单独的查询来完成。

for t in $(sqlite3 data.db "SELECT name FROM sqlite_master WHERE type='table'"); do
  echo -n "$t = "; sqlite3 data.db "SELECT COUNT(*) FROM $t;"
done

欢迎提出想法


你需要那个计数器干什么? - CL.
查看每种类型有多少条记录。最终删除sqlite_sequence中空表的条目。 - starfry
2个回答

7
我使用以下Shell语法来从我正在调试的数据库中盲目获取表计数。
db="database.db"
for i in `sqlite3 "$db" "SELECT name FROM sqlite_master WHERE 
type='table';"`; do echo -n $i\ \=\ ; sqlite3 "$db" "SELECT 
COUNT(*) FROM $i;"; done

cols = 0
sqlite_sequence = 0
datacols = 17
hits = 0
host = 0
document = 0
admin = 2
comments = 0

4
如果您想了解这些值以进行调试,可以查看sqlite3_analyzer工具的输出。
如果您想在程序中使用这些值,则必须在程序中动态生成查询语句。

“通过在程序中动态生成查询”,您是指在我的SQL中还是在调用SQL的“程序”中,例如我问题中的bash片段?我认为您指的是后者,因此我推断您的意思是SQLite不支持“动态SQL”。这个推断正确吗? - starfry
是的,SQLite被设计为嵌入到“真实”的程序中。 - CL.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接