MySQL - So zählen Sie alle Zeilen pro Tabelle in einer Abfrage


70

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


Erweiterte Antwort dafür in einem einzigen Schritt: stackoverflow.com/questions/24707814/…
gwideman

Antworten:


157
SELECT 
    TABLE_NAME, 
    TABLE_ROWS 
FROM 
    `information_schema`.`tables` 
WHERE 
    `table_schema` = 'YOUR_DB_NAME';

33
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';
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;

1
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:

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.


6

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';

6
SELECT 
    table_name, 
    table_rows 
FROM 
    INFORMATION_SCHEMA.TABLES

3
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

Ihr Abfrageergebnis unterscheidet sich von dem, was OP will - verwenden select *statt select sum(cnt)nad auch verwenden union allanstelle von union;).
shA.t

@ shA.t Einverstanden :) Aktualisiert.
a1ex07

0

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';

0

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.


0

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; 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.