sqlite запрос, чтобы получить весь список имен таблиц с количеством записей в нем - PullRequest
0 голосов
/ 27 мая 2019

Пожалуйста, помогите по запросу ниже: Запрос sqlite, чтобы получить весь список имен таблиц с количеством записей в нем:

Я хочу получить количество строк в каждой таблице в базе данных Sqlite3. Я хочу, чтобы избежать выписывания длинного запроса. Я могу получить список таблиц, как это:

ВЫБЕРИТЕ имя ОТ sqlite_master WHERE type = 'table' и я хотел бы использовать его в подзапросе, как это:

выберите количество (*) из (ВЫБЕРИТЕ имя ОТ sqlite_master WHERE type = 'table'); но просто возвращает общее количество строк в подзапросе, а это не то, что мне нужно.

1 Ответ

0 голосов
/ 27 мая 2019

Возможно, вы используете результаты 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 будет строкой, состоящей из списка целые числа, за которыми следует ноль или более аргументов. Первое целое число в этом список - это приблизительное количество строк в индексе. (Номер количество строк в индексе равно числу строк в таблице, за исключением частичных индексов.) .....

Если частичных индексов нет, SELECT tbl,cast(stat as INT) вернет количество строк в каждой таблице, если в таблице нет 0 строк.

Этот sql дает ожидаемые результаты для небольшой производственной базы данных (25 МБ, 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;
...