Soweit ich weiß, wird die Zeilenanzahl für InnoDB-Tabellen nicht gespeichert. Diese Abfrage kann höchstens eine Annäherung geben.
Álvaro González
1
Um die Gesamtzahl über 2+ Tabellen zu erhalten, können Sie sie ändern:SELECT SUM(TABLE_ROWS) FROM information_schema.tables WHERE table_schema = 'YOUR_DATABASE_NAME' && (TABLE_NAME='table1' || TABLE_NAME='table2')
entartet
8
Hinweis: TABLE_ROWSMöglicherweise ist die Synchronisierung mit dem aktuellen Tabelleninhalt nicht mehr möglich. Sie können sie jedoch aktualisieren, indem Sie Folgendes ausführen:) ANALYZE.
shA.t
3
Ich würde nur hinzufügen ORDER BY TABLE_ROWS DESC, um die Schweine zu erkennen.
BaseZen
Ich glaube nicht, dass diese Antwort ohne ANALYZE wertvoll ist, wie @ shA.t erwähnt hat.
teuber789
8
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';
SETSESSION group_concat_max_len = 10000000;
SET @rowCounts = (
SELECTgroup_concat(CONCAT('SELECT ''',TABLE_NAME,''', COUNT(*) FROM ', TABLE_NAME) SEPARATOR ' union all ')
FROM information_schema.tables WHERE table_schema = @tableSchema
);
PREPAREstatementFROM @rowCounts;
EXECUTEstatement;
-- don't run dealloc until you've exported your results ;)DEALLOCATEPREPAREstatement;
Vielen Dank. Dies funktioniert besser als alle anderen Lösungen, die ich gefunden habe. Tut genau das, was ich brauchte.
DaveEP
1
Dies ist die einzige vollständige Lösung.
Thejohnbackes
8
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:
selectconcat("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.
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:
CREATEDATABASEIFNOTEXISTS`admin`;
dann wechseln Sie hinein:
USE`admin`;
und erstellen Sie die gespeicherte Prozedur:
DROPPROCEDUREIFEXISTS`database_tables_row_count`;
DELIMITER $$
CREATEPROCEDURE`database_tables_row_count`(IN tableSchema VARCHAR(255))
BEGINDECLARE msg VARCHAR(128);
IF (SELECTCOUNT(TABLE_NAME) FROM information_schema.tables WHERE table_schema = `tableSchema`) = 0THENSET msg = CONCAT('Unknown database \'', `tableSchema`, '\'');
SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = msg, MYSQL_ERRNO = 1049;
ENDIF;
SETSESSION group_concat_max_len = 10000000;
SET @rowCounts = (
SELECTgroup_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
PREPAREstatementFROM @rowCounts;
EXECUTEstatement;
DEALLOCATEPREPAREstatement;
ELSE
# if no base tables found then return an empty setselect1where0 = 1;
ENDIF;
END$$
DELIMITER ;
Dann, um es trotz der aktuellen Datenbank zu verwenden:
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.
Selectgroup_concat(Query SEPARATOR ' union all ') as Full_Query from (SELECTCONCAT('SELECT ''',table_name,''', COUNT(*) FROM ', table_name) asQueryFROM information_schema.tables) AS T1 into @sqlfrom (select
table_schema db,
table_name tablename from information_schema.tables where table_schema notin
('performance_schema', 'mysql', 'information_schema')) t;
Dann renne-
prepare s from @sql; execute s; deallocateprepare s;
Antworten:
SELECT TABLE_NAME, TABLE_ROWS FROM `information_schema`.`tables` WHERE `table_schema` = 'YOUR_DB_NAME';
quelle
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;
quelle
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.
quelle
Dadurch erhalten Sie den genauen Tabellennamen und können auf eine einzelne Liste zählen
SELECT CONCAT('SELECT ''',table_name,''', COUNT(*) FROM ', table_name, ' union all') FROM information_schema.tables WHERE table_schema = 'clw';
quelle
SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES
quelle
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
quelle
select *
stattselect sum(cnt)
nad auch verwendenunion all
anstelle vonunion
;).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';
quelle
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:
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:
zu:
Wenn Sie die Anzahl der Zeilen auch für die Ansichten erhalten möchten.
quelle
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;
quelle