2012-06-06 11 views
9

Actualmente estoy utilizando la secuencia de comandosrecuento exacto de todas las filas de la base de datos MySQL

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

Sin embargo, no es exacta, ya que el motor utilizado por mis tablas de MySQL es InnoDB (sólo me di cuenta que esto podría ser un problema ahora, estas bases de datos han existido por un tiempo).

¿Hay alguna manera de obtener un conteo exacto de cada fila en cada tabla de una base de datos con MySQL?

Saludos.

+0

Porque accidentalmente se me cayó un 's' en mi ejemplo.De hecho, necesito contar las filas de todas las tablas en una base de datos en particular. –

+0

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

+1

Esto NO es un duplicado de http://stackoverflow.com/ preguntas/2692340/mysql-count-all-rows-per-table-for-in-one-query. Esta pregunta específicamente pregunta sobre bases de datos con tablas InnoDB. –

Respuesta

11

creo que la única manera precisa (y más lento) es hacer de cada tabla:

SELECT COUNT(*) FROM Table 
+0

@vearutop Dragon Jake menciona en su respuesta que esto debería ejecutarse en cada una de las tablas ... –

+1

No pondría todo en consulta SQL, parece que MySQL no puede seleccionar desde el nombre de tabla variable . Así que surgí al menos con el generador de consultas: 'SELECT CONCAT ('SELECT COUNT (*) FROM', table_name) FROM information_schema.tables WHERE table_schema = 'Tablas';' – jkrcma

+0

Cheers @DragonJake, resulta que eso es lo que tenía que hacer . :) –

-2

esto funcionó para mí

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

     ?> 

he probado este código y sus obras

salida 1145 para mí

+0

no fue lento para mí contó 1145 al instante todos los demás scanrios relacionados con el esquema no funcionaban para mí, simplemente dieron resultados nulos – Rinzler

+1

-1 para devolver todas las filas de todas las tablas en toda la base de datos. Use 'count (*)' en lugar de '*'. – dotancohen

1

Select Sum(column_Name) from table, no puedo dar el conteo exacto de las filas en una tabla, dará el conteo total de filas + 1, dará también la próxima fila de inserción de datos. y una cosa más es que, en sum(Column_Name) el column_Name debe ser int, si es varchar o la función char sum no funcionará. así que lo mejor es usar Select Count(*) from table para obtener el número exacto de filas en una tabla.

ThnQ,

Venkat

5

Esta instrucción SQL generará una consulta de unión que se puede completar la tarea en un solo paso:

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

Después de ejecutar la instrucción SQL, simplemente pega el resultado en un editor de texto, elimine la palabra "UNION" del final de la salida, y tendrá la consulta de unión.

Tenga en cuenta que ejecutar la consulta de unión podría tomar muchos recursos según el tamaño de la base de datos, la carga y el hardware, por lo que es posible que no desee ejecutarlo todo de una vez.

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

nombre_tabla significa número de tablas que está presente en "base de datos"

TABLE_ROWS significa filas número en cada columna

esquema_tabla es el nombre de base de datos. de la base de datos que está buscando los recuentos

+1

el recuento de table_rows en INFORMATION_SCHEMA no es exacto para las tablas de Innodb, es solo una aproximación. – forforf

+1

De acuerdo. Esto funcionará para tablas que no sean InnoDB, pero no aborda la pregunta específica. –

3

Estaba teniendo el mismo problema que me llevó a esta pregunta.

Gracias a la respuesta de computerGuy12345, se me ocurrió un procedimiento almacenado que hace esto sin tener que copiar y pegar. Como dijo, tenga en cuenta que esto escaneará cada tabla y podría tomar un tiempo.

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

Esto es muy útil. ¡Gracias! –

Cuestiones relacionadas