2012-06-06 16 views
9

obecnie używam skryptuDokładna liczba wszystkich wierszy w bazie danych MySQL

SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tables'; 

Jednak to nie jest dokładna, ponieważ silnik używany przez moich tabelach MySQL InnoDB (I tylko sobie sprawę, to może być problem teraz, czy te bazy danych istniały przez jakiś czas).

Czy istnieje sposób na uzyskanie dokładnego zliczenia każdego wiersza w każdej tabeli bazy danych za pomocą MySQL?

Pozdrawiam.

+0

Bo przypadkowo upuściłem "s" w moim przykładzie.Faktycznie muszę policzyć wiersze ze wszystkich tabel w konkretnej bazie danych. –

+0

Rozszerzona odpowiedź: http://stackoverflow.com/questions/24707814/mysql-summarize-all-table-row-counts-in-a-single-query – gwideman

+1

To NIE jest duplikatem http://stackoverflow.com/ pytania/2692340/mysql-count-all-rows-per-table-for-in-one-query. To pytanie dotyczy w szczególności baz danych z tabelami InnoDB. –

Odpowiedz

11

myślę, że tylko dokładne (i wolniejsze) sposób to zrobić dla każdej tabeli:

SELECT COUNT(*) FROM Table 
+0

@vearutop Dragon Jake wspomina w swojej odpowiedzi, że to powinno być uruchamiane na każdej tabeli ... –

+1

Nie wstawiłbym wszystkiego do zapytania SQL, wygląda na to, że MySQL nie jest w stanie wybrać z nazwy tabeli zmiennej . Tak więc przyszedłem przynajmniej z generatorem zapytań: SELECT CONCAT (WYBIERZ LICZBĘ (*) FROM), table_name) FROM information_schema.tables WHERE table_schema = 'Tables'; ' – jkrcma

+0

Pozdrowienia @DragonJake, okazało się, że to właśnie musiałem zrobić . :) –

-2

ten pracował dla mnie

<?php 

      mysql_connect("localhost", "root", "pass") or die(mysql_error()); 

      mysql_select_db("csl") or die(mysql_error()); 

      $dtb=mysql_query("SHOW TABLES") or die (mysql_error()); 

      $jmltbl=0; $jml_record=0; $jml_record=0; $total =0; 


      while($row=mysql_fetch_array($dtb)) 

    { 

$sql=mysql_query("select * from $row[0]"); 

$jml_record=mysql_num_rows($sql); 

$total += $jml_record; // this counts all the rows 





$jmltbl++; $jml_record+=$jml_record; 




    } 
     // echo"--------$jmltbl Tables, $jml_record records."; // will print count of indivual table 

echo $total; // this will print you count of all rows in MySQL database 

     ?> 

Ja testowałem ten kod i jego dzieła

wyjście 1145 dla mnie

+0

to nie było powolne dla mnie to od razu policzyło 1145 wszystkie inne skanery związane z schematem nie działały dla mnie, po prostu dały zerowe wyniki – Rinzler

+1

-1 dla zwrócenia wszystkich wierszy ze wszystkich tabel w całej bazie danych. Użyj 'count (*)' zamiast '*'. – dotancohen

1

Select Sum(column_Name) from table, nie można podać dokładnej liczby rzędów w tabelę, która daje całkowitą liczbę wierszy + 1, wil daje także następne wstawianie wiersza danych. i jeszcze jedno, w sum(Column_Name) kolumna nazwa powinna być int, jeśli jest to funkcja varchar lub char suma, nie będzie działać. więc najlepszą rzeczą jest użycie Select Count(*) from table, aby uzyskać dokładną liczbę wierszy w tabeli.

ThnQ,

Venkat

5

Ta instrukcja SQL wygeneruje zapytanie związkową, która może wykonać zadanie w jednym kroku:

SELECT CONCAT('SELECT \'', table_name ,'\' as tbl, (SELECT COUNT(*) FROM ', table_name, ') AS ct UNION') 
FROM information_schema.tables 
WHERE table_schema = 'your_database'; 

Po uruchomieniu SQL, wystarczy wkleić wyjście do edytor tekstu, usuń słowo "UNION" z końca pliku wyjściowego, a otrzymasz zapytanie związkowe.

Należy pamiętać, że uruchamianie kwerendy związanej może wymagać dużej ilości zasobów w zależności od rozmiaru, obciążenia i sprzętu bazy danych, więc możesz nie chcieć uruchamiać wszystkiego naraz.

0
select table_name,table_rows from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='database name'; 

table_name oznacza liczbę tablic, który jest obecny w „bazy danych”

table_rows oznacza liczba rzędów w każdej kolumnie

TABLE_SCHEMA jest nazwą bazy danych. z której bazy danych się liczy

+1

licznik table_rows w INFORMATION_SCHEMA nie jest dokładny dla tabel Innodb, to tylko przybliżenie. – forforf

+1

Uzgodnione. Będzie to działać w przypadku tabel innych niż InnoDB, ale nie odnosi się do konkretnego pytania. –

3

Miałem ten sam problem, który doprowadził mnie do tego pytania.

Dzięki odpowiedzi computerGuy12345, wymyśliłem procedurę przechowywaną, która robi to bez konieczności kopiowania i wklejania. Jak powiedział, strzeż się, że to zeskanuje każdy stół i może trochę potrwać.

DELIMITER $$ 

CREATE PROCEDURE `all_tables_rowcount`(databaseName VARCHAR(250)) 
BEGIN 
DECLARE p_done INT DEFAULT FALSE; 
DECLARE p_queryString varchar(250) ; 
DECLARE p_cur CURSOR FOR SELECT queryString FROM tmp.tableCountQueries; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET p_done = TRUE; 

DROP TEMPORARY TABLE IF EXISTS tmp.tableCountQueries; 
DROP TEMPORARY TABLE IF EXISTS tmp.tableCounts; 

CREATE TEMPORARY TABLE tmp.tableCounts(TableName varchar(250), RowCount BIGINT) ; 

CREATE TEMPORARY TABLE tmp.tableCountQueries(queryString varchar(250)) AS 
(
    SELECT CONCAT(
     'INSERT INTO tmp.tableCounts(TableName, RowCount) SELECT "', 
     table_name, 
     '", COUNT(*) AS RowCount FROM ', 
     table_schema, 
     '.', 
     table_name 
    ) AS queryString 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE table_schema = databaseName 
) ; 

OPEN p_cur; 

read_loop: LOOP 
    FETCH p_cur INTO p_queryString; 
    IF p_done THEN 
     LEAVE read_loop; 
    END IF; 
    SET @queryString = p_queryString ; 
    PREPARE rowcountTable FROM @queryString; 
    EXECUTE rowcountTable ; 
END LOOP; 

SELECT * FROM tmp.tableCounts ; 
END 
+0

Jest to bardzo pomocne. Dzięki! –

Powiązane problemy