当前位置: 首页 > article >正文

MySQL获取数据库内所有表格数据总数

在 MySQL 中,要获取数据库内所有表格的数据总数,可以编写一个查询脚本来遍历每个表并计算其行数。你可以使用 INFORMATION_SCHEMA 数据库,它包含了关于数据库元数据的表格,如 TABLESCOLUMNS

以下是一个示例脚本,展示了如何使用 SQL 查询和存储过程来获取所有表格的数据总数:

使用 SQL 查询和脚本

  1. 查询所有表的行数(直接方法,适合命令行工具)

如果你只是临时需要这些信息,并且你的数据库表数量不多,可以直接在命令行工具中运行以下查询:

SELECT 
    table_name AS 'Table',
    table_rows AS 'Rows'
FROM 
    information_schema.tables
WHERE 
    table_schema = 'your_database_name'
    AND table_type = 'BASE TABLE';

your_database_name 替换为你的实际数据库名称。table_rows 列提供了每个表的行数估算值(对于 InnoDB 表,这可能是一个估算值,而不是精确值)。

  1. 使用存储过程(适合更复杂的场景)

如果你只想获取所有表的总行数,可以使用以下查询:

SELECT SUM(table_rows) 
FROM information_schema.tables 
WHERE table_schema = 'your_database_name';

这将返回数据库中所有表的行数总和。

  1. 使用存储过程(适合更复杂的场景)

如果你需要更灵活或者更复杂的处理,可以创建一个存储过程来遍历所有表并计算其行数。以下是一个示例存储过程:

DELIMITER //  -- 设置新的语句结束符为"//",以便在存储过程中使用";"而不结束整个存储过程的定义。
 
CREATE PROCEDURE CountAllTableRows()  -- 创建一个名为CountAllTableRows的存储过程。
BEGIN
    -- 变量声明部分
    DECLARE done INT DEFAULT FALSE;  -- 声明一个名为done的整型变量,用于标记游标是否读取完毕,初始值为FALSE。
    DECLARE tbl_name VARCHAR(255);    -- 声明一个名为tbl_name的字符串变量,用于存储当前处理的表名。
    DECLARE row_count INT DEFAULT 0;  -- 声明一个名为row_count的整型变量,用于临时存储行数(但在这个过程中并未使用到)。
    
    -- 游标声明部分
    DECLARE cur CURSOR FOR  -- 声明一个名为cur的游标。
        SELECT table_name   -- 游标查询的SQL语句,从information_schema.tables中选择表名。
        FROM information_schema.tables 
        WHERE table_schema = 'your_database_name'  -- 限定查询的数据库名(需要替换为实际的数据库名)。
          AND table_type = 'BASE TABLE';  -- 只选择基本表(排除视图等)。
 
    -- 继续处理游标结束时的处理器
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;  -- 当游标读取不到数据时,设置done为TRUE。
 
    -- 临时表声明部分
    CREATE TEMPORARY TABLE IF NOT EXISTS temp_row_counts (  -- 创建一个名为temp_row_counts的临时表(如果不存在)。
        table_name VARCHAR(255),  -- 存储表名。
        row_count BIGINT  -- 存储行数,使用BIGINT以支持大表。
    );
 
    -- 打开游标
    OPEN cur;
 
    -- 读取循环
    read_loop: LOOP  -- 定义一个名为read_loop的循环。
        FETCH cur INTO tbl_name;  -- 从游标中读取一个表名到tbl_name变量。
        IF done THEN  -- 判断是否读取完毕。
            LEAVE read_loop;  -- 如果读取完毕,则离开循环。
        END IF;
 
        -- 获取当前表的行数
        SET @s = CONCAT('SELECT COUNT(*) INTO @cnt FROM ', tbl_name);  -- 拼接动态SQL语句。
        PREPARE stmt FROM @s;  -- 准备执行动态SQL语句。
        EXECUTE stmt;  -- 执行动态SQL语句,结果存储在@cnt变量中。
        DEALLOCATE PREPARE stmt;  -- 释放动态SQL语句。
 
        -- 将行数插入临时表
        INSERT INTO temp_row_counts (table_name, row_count) VALUES (tbl_name, @cnt);  -- 将表名和行数插入临时表。
    END LOOP;
 
    -- 关闭游标
    CLOSE cur;
 
    -- 从临时表中选择结果
    SELECT * FROM temp_row_counts;  -- 查询并显示临时表中的所有记录。
 
    -- 删除临时表
    DROP TEMPORARY TABLE IF EXISTS temp_row_counts;  -- 删除临时表(如果存在)。
END //  -- 存储过程定义结束。
 
DELIMITER ;  -- 将语句结束符重置为默认的";"。

然后,你可以通过调用存储过程来获取所有表的行数:

CALL CountAllTableRows();

注意事项:

  1. 在实际使用存储过程之前,需要将 ‘your_database_name’ 替换为实际的数据库名称。
  2. 存储过程中使用了动态SQL(通过 PREPARE 和 EXECUTE 语句),这是因为在存储过程中直接执行包含变量作为表名的SQL语句是不被允许的。
  3. 临时表 temp_row_counts 用于存储每个表的行数,以便在存储过程结束时能够一次性查询并显示所有结果。
  4. 使用 BIGINT 类型来存储行数,以支持可能非常大的表。

敲黑板

  1. 性能:对于非常大的数据库,这些方法可能非常耗时和占用资源。
  2. 估算值:对于 InnoDB 表,table_rows 列可能是一个估算值,而不是精确值。如果需要精确值,必须执行 COUNT(*) 查询。
  3. 权限:确保你的数据库用户有足够的权限访问 INFORMATION_SCHEMA 并执行所需的查询。

通过上述方法,你可以轻松获取 MySQL 数据库中所有表格的数据总数。


http://www.kler.cn/a/410157.html

相关文章:

  • 解决getSubject is supported only if a security manager is allowed
  • HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案开发者测试
  • 计算机网络——第3章 数据链路层(自学笔记)
  • 机器学习中数据集Upsampling和Downsampling是什么意思?中英文介绍
  • Spring Boot 实战:基于 Validation 注解实现分层数据校验与校验异常拦截器统一返回处理
  • IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题一)
  • PostgreSQL 中约束Constraints
  • Oracle 数据库 23ai 新特性: Schema Annotations
  • react中的useCallback 有什么作用?
  • SQL Server数据库日志(ldf文件)清理
  • GPT中转站技术架构
  • 微软发布「AI Shell」
  • CentOS环境上离线安装python3及相关包
  • 图像标签格式转换
  • 算法笔记:单调队列
  • 如何在树莓派5+ubunut24上编译Qt5.15.15
  • 文件上传代码分析
  • C++数据结构与算法
  • 干货分享|分布式数据科学工具 Xorbits 的使用
  • k8s中部署filebeat进行日志监听并发送到es中