mysql 第37章 获取数据库内所有表格数据总数 mysql 第37章 获取数据库内所有表格数据总数

6小时前

一、前言

在 MySQL 中,要获取数据库内所有表格的数据总数,可以编写一个查询脚本来遍历每个表并计算其行数。

你可以使用 INFORMATION_SCHEMA 数据库,它包含了关于数据库元数据的表格,如 TABLES 和 COLUMNS。

二、示例脚本

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

2.1、使用 SQL 查询和脚本

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

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

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 表,这可能是一个估算值,而不是精确值)。

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

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

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

2.2、使用存储过程

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

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();

注意事项:

  • 在实际使用存储过程之前,需要将 ‘your_database_name’ 替换为实际的数据库名称。

  • 存储过程中使用了动态SQL(通过 PREPARE 和 EXECUTE 语句),这是因为在存储过程中直接执行包含变量作为表名的SQL语句是不被允许的。

  • 临时表 temp_row_counts 用于存储每个表的行数,以便在存储过程结束时能够一次性查询并显示所有结果。

  • 使用 BIGINT 类型来存储行数,以支持可能非常大的表。

三、敲黑板

  • 性能:对于非常大的数据库,这些方法可能非常耗时和占用资源。

  • 估算值:对于 InnoDB 表,table_rows 列可能是一个估算值,而不是精确值。如果需要精确值,必须执行 COUNT(*) 查询。

  • 权限:确保你的数据库用户有足够的权限访问 INFORMATION_SCHEMA 并执行所需的查询。

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

阅读 11

mysql文章
带到手机上看