Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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-如何在一个查询中统计每个表的所有行_Sql_Mysql_Count - Fatal编程技术网

MySQL-如何在一个查询中统计每个表的所有行

MySQL-如何在一个查询中统计每个表的所有行,sql,mysql,count,Sql,Mysql,Count,有没有办法查询数据库以找出所有表中有多少行 i、 e 希望您能建议以上内容将为您提供一个近似值,但如果您需要精确的计数,可以分两步完成。首先,执行如下查询: SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES select concat("select '",table_name,"', count(*) from ",table_name,";") from `information_sc

有没有办法查询数据库以找出所有表中有多少行

i、 e


希望您能建议

以上内容将为您提供一个近似值,但如果您需要精确的计数,可以分两步完成。首先,执行如下查询:

SELECT 
    table_name, 
    table_rows 
FROM 
    INFORMATION_SCHEMA.TABLES
select concat("select '",table_name,"', count(*) from ",table_name,";") 
from `information_schema`.`tables` 
WHERE `table_schema` = '[your schema here]';

这将生成一个SQL语句列表,数据库中的每个表对应一个SQL语句,然后您可以运行以获得准确的计数。

这将为您提供一个列表中的准确表名和计数

SELECT CONCAT('SELECT ''',table_name,''', COUNT(*) FROM ', table_name, ' union all') 
      FROM information_schema.tables WHERE table_schema = 'clw';

将上述信息合成一组查询,我们得到一个自写查询,该查询将给出准确的行数:

SET @tableSchema = 'my_schema';
SET SESSION group_concat_max_len = 10000000;
SET @rowCounts = (
  SELECT group_concat(CONCAT('SELECT ''',TABLE_NAME,''', COUNT(*) FROM ', TABLE_NAME) SEPARATOR ' union all ')
  FROM information_schema.tables WHERE table_schema = @tableSchema
);
PREPARE statement FROM @rowCounts;
EXECUTE statement;

-- don't run dealloc until you've exported your results ;)
DEALLOCATE PREPARE statement;

如果只需要表而不需要视图,则可能需要此选项:

SELECT TABLE_NAME, TABLE_ROWS
FROM   `information_schema`.`tables` 
WHERE  `table_schema` = 'schema'
       AND TABLE_TYPE = 'BASE TABLE';

使用存储过程获取表的行很方便。例如:

CALL database_tables_row_count('my_shop_db');
将显示:

+-------------------+-----------+
| table             | row_count |
+-------------------+-----------+
| user              |         5 |
| payment           |        12 |
+-------------------+-----------+
如果“my_shop_db”内没有桌子,您将获得:

Empty set (0.00 sec)
ERROR 1049 (42000): Unknown database 'my_so_db'
如果数据库名称拼写错误,您将得到:

Empty set (0.00 sec)
ERROR 1049 (42000): Unknown database 'my_so_db'
与您发出声明的方式相同
使用不存在的\u db

存储过程必须存储在某个地方(数据库中)。如果将其存储到当前数据库中,您将能够以这种方式使用它

CALL database_tables_row_count('my_shop_db');
只要使用存储该过程的当前数据库,就可以获得有关任何数据库的结果

由于此类查询(如表的行数)非常常见,因此您可能希望将该过程存储在公共数据库(一种工具箱)中,例如称为
admin
。要在新数据库中创建存储过程,请执行以下操作:

CREATE DATABASE IF NOT EXISTS `admin`;
然后切换到它:

USE `admin`;
并创建存储过程:

DROP PROCEDURE IF EXISTS `database_tables_row_count`;

DELIMITER $$
CREATE PROCEDURE `database_tables_row_count`(IN tableSchema VARCHAR(255))
BEGIN
    DECLARE msg VARCHAR(128);

    IF (SELECT COUNT(TABLE_NAME) FROM information_schema.tables WHERE table_schema = `tableSchema`) = 0 THEN
        SET msg = CONCAT('Unknown database \'', `tableSchema`, '\'');
        SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = msg, MYSQL_ERRNO = 1049;
    END IF;

    SET SESSION group_concat_max_len = 10000000;
    SET @rowCounts = (
        SELECT group_concat(CONCAT('SELECT ''',TABLE_NAME,''' AS `table`, COUNT(*) AS `row_count` FROM ', `tableSchema`, '.', TABLE_NAME) SEPARATOR ' union all ')
        FROM information_schema.tables WHERE table_schema = `tableSchema`
        AND TABLE_TYPE = 'BASE TABLE'
    );

    IF @rowCounts IS NOT NULL THEN
        PREPARE statement FROM @rowCounts;
        EXECUTE statement;
        DEALLOCATE PREPARE statement;
    ELSE
        # if no base tables found then return an empty set
        select 1 where 0 = 1;
    END IF;

END$$
DELIMITER ;
然后,不管当前数据库如何使用它:

CALL admin.database_tables_row_count('my_shop_db');
为了得到结果

不需要创建一个单独的数据库来保存该过程,但我发现有一个专用数据库作为工具箱很有用,这样我就不需要为每次开发和每次使用drop database后重新创建过程/视图/函数

您可能需要更改此行:

AND TABLE_TYPE = 'BASE TABLE'
致:


如果还希望获取视图的行数。

运行此查询以获取结果,则信息架构不会给出正确的结果

Select group_concat(Query SEPARATOR ' union all ') as Full_Query from (SELECT CONCAT('SELECT ''',table_name,''', COUNT(*) FROM ', table_name) as Query
FROM information_schema.tables) AS T1 into @sql from (select 
table_schema db,
table_name tablename from information_schema.tables where table_schema not in 
('performance_schema', 'mysql', 'information_schema')) t; 
然后跑-

prepare s from @sql; execute s; deallocate prepare s; 

据我所知,InnoDB表不存储行计数。此查询最多可以给出一个近似值。要获得2+个表的总计数,您可以对其进行修改:
从信息模式中选择SUM(表行)。其中表模式='YOUR_DATABASE_NAME'&&(表名='table1'| |表名='table2')
注意:
表行
可能与当前表内容不同步,但您可以通过运行
ANALYZE
;)来更新它。我只想添加
ORDER BY TABLE_ROWS DESC
来检测猪。我觉得这个答案没有必要像@shA.t提到的那样先进行分析。一步完成的扩展答案:您的查询结果将不同于OP想要的-使用
select*
而不是
select sum(cnt)
nad也使用
union all
代替
union
;)@沙特同意:)更新。谢谢。这比我找到的任何其他解决方案都有效。这正是我需要的。这是唯一完整的解决方案。
Select group_concat(Query SEPARATOR ' union all ') as Full_Query from (SELECT CONCAT('SELECT ''',table_name,''', COUNT(*) FROM ', table_name) as Query
FROM information_schema.tables) AS T1 into @sql from (select 
table_schema db,
table_name tablename from information_schema.tables where table_schema not in 
('performance_schema', 'mysql', 'information_schema')) t; 
prepare s from @sql; execute s; deallocate prepare s;