2012-06-06 8 views
9

Attualmente sto usando lo scriptconto esatto di tutte le righe di database MySQL

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

Tuttavia, non è preciso, perché il motore utilizzato dai miei tabelle di MySQL è InnoDB (mi sono reso conto solo questo potrebbe essere un problema ora, questi database sono esistiti per un po ').

C'è un modo per ottenere un conteggio esatto di ogni riga in ogni tabella di un database con MySQL?

Cheers.

+0

Perché nel mio esempio ho accidentalmente lasciato cadere una "s".In realtà ho bisogno di contare le righe da tutte le tabelle in un particolare database. –

+0

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

+1

Questo NON è un duplicato di http://stackoverflow.com/ domande/2692340/mysql-count-all-file-per-tavolo-per-in-one-query. Questa domanda riguarda specificamente i database con tabelle InnoDB. –

risposta

11

Credo che l'unico modo accurato (e più lento) è quello di fare per ogni singola tabella:

SELECT COUNT(*) FROM Table 
+0

@vearutop Dragon Jake cita nella sua risposta che questo dovrebbe essere eseguito su ogni singolo tavolo ... –

+1

Non metterei tutto nella query SQL, sembra che MySQL non sia in grado di selezionare dal nome della tabella variabile . Così sono arrivato almeno con il generatore di query: 'SELEZIONA CONCAT ('SELECT COUNT (*) FROM', table_name) FROM information_schema.tables WHERE table_schema = 'Tabelle';' – jkrcma

+0

Cheers @DragonJake, risulta che è quello che dovevo fare . :) –

-2

questo ha funzionato per me

<?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 

     ?> 

Ho testato questo codice e le sue opere

output 1145 per me

+0

non è stato lento per me ha contato 1145 istantaneamente tutti gli altri scanrios relativi allo schema non funzionavano per me hanno appena dato risultati nulli – Rinzler

+1

-1 per restituire tutte le righe di tutte le tabelle nell'intero database. Usa 'count (*)' invece di '*'. – dotancohen

1

Select Sum(column_Name) from table, impossibile indicare il numero esatto di righe in una tabella, fornirà il conteggio totale delle righe + 1, wil darà anche la successiva riga di inserimento dei dati. e un'altra cosa è, in sum(Column_Name) il column_Name dovrebbe essere int, se è varchar o la funzione char sum non funzionerà. quindi la cosa migliore è usare Select Count(*) from table per ottenere il numero esatto di righe in una tabella.

ThnQ,

Venkat

5

Questa istruzione SQL genererà una query di unione che può completare l'operazione in un unico passaggio:

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

Dopo aver eseguito l'istruzione SQL, basta incollare l'output in un editor di testo, elimina la parola "UNION" dalla fine dell'output e avrai la query di unione.

Attenzione che l'esecuzione della query di unione può richiedere molte risorse a seconda delle dimensioni del database, del carico e dell'hardware, quindi è possibile che non si voglia eseguire tutto in una volta.

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

nome_della_tabella indica il numero di tabelle che è presente in "data base"

table_rows significa numero righe in ciascuna colonna

schema_tabella è il nome del database. da quale base di dati stai cercando i conteggi

+1

il conteggio table_rows in INFORMATION_SCHEMA non è accurato per le tabelle Innodb, è solo un'approssimazione. – forforf

+1

concordato. Ciò funzionerà con tabelle non InnoDB ma non risolve la domanda specifica. –

3

Avevo lo stesso problema che mi ha portato a questa domanda.

Grazie alla risposta del computer Guy12345, ho trovato una procedura memorizzata che lo esegue senza dover copiare e incollare. Come ha detto, fai attenzione che questo eseguirà la scansione di ogni tabella e potrebbe richiedere un po 'di tempo.

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

Questo è molto utile. Grazie! –