MySQL数据库中所有行的精确计数

时间:2012-06-06 10:47:23

标签: mysql sql database innodb

我目前正在使用脚本

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

然而,这并不准确,因为我的MySQL表使用的引擎是InnoDB(我只是意识到这可能是一个问题,这些数据库已经存在了一段时间)。

有没有办法用MySQL获取数据库每个表中每一行的精确计数?

干杯。

6 个答案:

答案 0 :(得分:11)

我认为唯一准确(和更慢)的方法是为每一张表做:

SELECT COUNT(*) FROM Table

答案 1 :(得分:5)

此SQL语句将生成一个联合查询,该查询可以一步完成任务:

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

运行SQL语句后,只需将输出粘贴到文本编辑器中,从输出末尾删除单词“UNION”,即可进行联合查询。

请注意,运行union查询可能会占用大量资源,具体取决于您的数据库大小,负载和硬件,因此您可能不希望一次性运行它。

答案 2 :(得分:3)

我遇到了同样的问题,导致我回答这个问题。

感谢computerGuy12345的回答,我提出了一个存储过程 无需复制粘贴即可完成此操作。 正如他所说,请注意这会扫描每张桌子并可能需要一段时间。

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

答案 3 :(得分:1)

Select Sum(column_Name) from table,无法给出表中的确切行数,它会给出总行数+1,同时也会给出下一个数据插入行。还有一件事是,在sum(Column_Name)中,column_Name应该是int,如果它是varchar或char sum函数将不起作用。所以最好的事情是使用        Select Count(*) from table获取表格中的确切行数。

ThnQ,

Venkat

答案 4 :(得分:0)

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

table_name 表示“数据库”中存在的表数

table_rows 表示每列中的数字行

table_schema 是数据库名称。从哪个数据库中查找计数

答案 5 :(得分:-2)

这对我有用

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

       ?>

我已经测试了这段代码及其作品

为我输出1145