Gibt es eine Möglichkeit, die Datenbank abzufragen, um herauszufinden, wie viele Zeilen in allen Tabellen enthalten sind?
dh
table1 1234
table2 222
table3 7888
Ich hoffe, Sie können beraten
Gibt es eine Möglichkeit, die Datenbank abzufragen, um herauszufinden, wie viele Zeilen in allen Tabellen enthalten sind?
dh
table1 1234
table2 222
table3 7888
Ich hoffe, Sie können beraten
Antworten:
SELECT
TABLE_NAME,
TABLE_ROWS
FROM
`information_schema`.`tables`
WHERE
`table_schema` = 'YOUR_DB_NAME';
SELECT SUM(TABLE_ROWS) FROM information_schema.tables WHERE table_schema = 'YOUR_DATABASE_NAME' && (TABLE_NAME='table1' || TABLE_NAME='table2')
TABLE_ROWS
Möglicherweise ist die Synchronisierung mit dem aktuellen Tabelleninhalt nicht mehr möglich. Sie können sie jedoch aktualisieren, indem Sie Folgendes ausführen:) ANALYZE
.
ORDER BY TABLE_ROWS DESC
, um die Schweine zu erkennen.
Wenn wir die obigen Informationen und diesen Beitrag zu einer Reihe von Abfragen zusammenfassen, erhalten wir eine selbstschreibende Abfrage, die genaue Zeilenzahlen liefert:
SET @tableSchema = 'my_schema';
SET SESSION group_concat_max_len = 10000000;
SET @rowCounts = (
SELECT group_concat(CONCAT('SELECT ''',TABLE_NAME,''', COUNT(*) FROM ', TABLE_NAME) SEPARATOR ' union all ')
FROM information_schema.tables WHERE table_schema = @tableSchema
);
PREPARE statement FROM @rowCounts;
EXECUTE statement;
-- don't run dealloc until you've exported your results ;)
DEALLOCATE PREPARE statement;
Das Obige gibt Ihnen eine Annäherung, aber wenn Sie eine genaue Zählung wünschen, kann dies in zwei Schritten erfolgen. Führen Sie zunächst eine Abfrage wie die folgende aus:
select concat("select '",table_name,"', count(*) from ",table_name,";")
from `information_schema`.`tables`
WHERE `table_schema` = '[your schema here]';
Daraufhin wird eine Liste von SQL-Anweisungen erstellt, eine für jede Tabelle in Ihrer Datenbank. Sie können diese dann ausführen, um eine genaue Anzahl zu erhalten.
select sum(cnt) from
(
select count(*) as cnt from table1
union ALL
select count(*) as cnt from table2
union ALL
select count(*) as cnt from table3
)t1
select *
statt select sum(cnt)
nad auch verwenden union all
anstelle von union
;).
Wahrscheinlich möchten Sie dies, wenn Sie nur Tabellen und keine Ansichten möchten:
SELECT TABLE_NAME, TABLE_ROWS
FROM `information_schema`.`tables`
WHERE `table_schema` = 'schema'
AND TABLE_TYPE = 'BASE TABLE';
Es ist praktisch, eine gespeicherte Prozedur zu verwenden, um Tabellenzeilen abzurufen. Zum Beispiel:
CALL database_tables_row_count('my_shop_db');
wird angezeigt:
+-------------------+-----------+
| table | row_count |
+-------------------+-----------+
| user | 5 |
| payment | 12 |
+-------------------+-----------+
Falls es in 'my_shop_db' keine Tabellen gibt, erhalten Sie:
Empty set (0.00 sec)
Wenn Sie den Datenbanknamen falsch schreiben, erhalten Sie:
ERROR 1049 (42000): Unknown database 'my_so_db'
Auf die gleiche Weise, als hätten Sie die Erklärung abgegeben use non_existing_db;
Die gespeicherte Prozedur muss irgendwo (in einer Datenbank) gespeichert sein. Wenn Sie es in der aktuellen Datenbank speichern, können Sie es auf diese Weise verwenden
CALL database_tables_row_count('my_shop_db');
Um die Ergebnisse für eine Datenbank zu erhalten, verwenden Sie Ihre aktuelle Datenbank, in der Sie diese Prozedur gespeichert haben
Da eine solche Abfrage wie die Anzahl der Zeilen von Tabellen häufig vorkommt, möchten Sie diese Prozedur möglicherweise in einer gemeinsamen Datenbank (einer Art Toolbox) speichern, z admin
. B. aufgerufen . So erstellen Sie die gespeicherte Prozedur in einer neuen Datenbank:
CREATE DATABASE IF NOT EXISTS `admin`;
dann wechseln Sie hinein:
USE `admin`;
und erstellen Sie die gespeicherte Prozedur:
DROP PROCEDURE IF EXISTS `database_tables_row_count`;
DELIMITER $$
CREATE PROCEDURE `database_tables_row_count`(IN tableSchema VARCHAR(255))
BEGIN
DECLARE msg VARCHAR(128);
IF (SELECT COUNT(TABLE_NAME) FROM information_schema.tables WHERE table_schema = `tableSchema`) = 0 THEN
SET msg = CONCAT('Unknown database \'', `tableSchema`, '\'');
SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = msg, MYSQL_ERRNO = 1049;
END IF;
SET SESSION group_concat_max_len = 10000000;
SET @rowCounts = (
SELECT group_concat(CONCAT('SELECT ''',TABLE_NAME,''' AS `table`, COUNT(*) AS `row_count` FROM ', `tableSchema`, '.', TABLE_NAME) SEPARATOR ' union all ')
FROM information_schema.tables WHERE table_schema = `tableSchema`
AND TABLE_TYPE = 'BASE TABLE'
);
IF @rowCounts IS NOT NULL THEN
PREPARE statement FROM @rowCounts;
EXECUTE statement;
DEALLOCATE PREPARE statement;
ELSE
# if no base tables found then return an empty set
select 1 where 0 = 1;
END IF;
END$$
DELIMITER ;
Dann, um es trotz der aktuellen Datenbank zu verwenden:
CALL admin.database_tables_row_count('my_shop_db');
um die Ergebnisse zu erhalten.
Es ist nicht erforderlich, eine separate Datenbank zu erstellen, um diese Prozedur zu speichern, aber ich fand es nützlich, eine dedizierte Datenbank zu haben, die als eine Art Toolbox fungiert, sodass ich Prozeduren / Ansichten / Funktionen nicht für jede Entwicklung und jedes Mal neu erstellen muss nachdem ich drop database benutzt habe ...
Möglicherweise möchten Sie diese Zeile ändern:
AND TABLE_TYPE = 'BASE TABLE'
zu:
AND TABLE_TYPE IN ('BASE TABLE', 'VIEW')
Wenn Sie die Anzahl der Zeilen auch für die Ansichten erhalten möchten.
Führen Sie diese Abfrage a aus, um Ergebnisse zu erhalten. Das Informationsschema liefert keine korrekten Ergebnisse.
Select group_concat(Query SEPARATOR ' union all ') as Full_Query from (SELECT CONCAT('SELECT ''',table_name,''', COUNT(*) FROM ', table_name) as Query
FROM information_schema.tables) AS T1 into @sql from (select
table_schema db,
table_name tablename from information_schema.tables where table_schema not in
('performance_schema', 'mysql', 'information_schema')) t;
Dann renne-
prepare s from @sql; execute s; deallocate prepare s;