Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL数据库中所有行的精确计数_Mysql_Sql_Database_Innodb - Fatal编程技术网

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

MySQL数据库中所有行的精确计数,mysql,sql,database,innodb,Mysql,Sql,Database,Innodb,我目前正在使用脚本 SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tables'; 然而,这并不准确,因为我的MySQL表使用的引擎是InnoDB(我现在才意识到这可能是一个问题,因为这些数据库已经存在了一段时间) 有没有办法通过MySQL获得数据库每个表中每一行的精确计数 干杯。我认为唯一准确(且更慢)的方法是为每一张桌子做: SELECT COUNT(*) FROM Table 这对

我目前正在使用脚本

SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tables';
然而,这并不准确,因为我的MySQL表使用的引擎是InnoDB(我现在才意识到这可能是一个问题,因为这些数据库已经存在了一段时间)

有没有办法通过MySQL获得数据库每个表中每一行的精确计数

干杯。

我认为唯一准确(且更慢)的方法是为每一张桌子做:

SELECT COUNT(*) FROM Table
这对我有用

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

从表
中选择Sum(列名),无法给出表中行的精确计数,它将给出总行数+1,还将给出下一个数据插入行。还有一件事是,在
sum(Column\u Name)
中,如果列名称是varchar或char sum函数,那么它应该是int。所以最好的事情就是使用
从表中选择Count(*)以获取表中的确切行数

ThnQ


Venkat

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

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查询

请注意,根据数据库大小、负载和硬件的不同,运行联合查询可能会占用大量资源,因此您可能不希望同时运行所有查询

select table_name,table_rows from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='database name';
表格名称表示“数据库”中存在的表格数量

表_行表示每列中的行数


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

我遇到了与此问题相同的问题

多亏了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

因为我不小心在我的例子中掉了一个“s”。我实际上需要计算特定数据库中所有表中的行数。这个问题专门询问使用InnoDB表的数据库。@vearutop Dragon Jake在回答中提到,这需要在每个表上运行……我不会将所有内容都放在SQL查询中,似乎MySQL无法从变量表名中进行选择。所以我至少想到了查询生成器:
SELECT CONCAT('SELECT COUNT(*)FROM',table_name)FROM information_schema.tables,其中table_schema='tables'干杯@DragonJake,原来这就是我必须做的事。:)这对我来说并不慢,它计算了1145个,所有其他与模式相关的scanrio都不为我工作,它们只给出了null结果——1返回整个数据库中所有表的所有行。使用
count(*)
而不是
*
。信息模式中的表行数对于Innodb表不准确,它只是一个近似值。同意。这将适用于非InnoDB表,但不会解决具体问题。这非常有用。谢谢