【问题标题】:Mysql select all existing tables from current database using stored procedureMysql使用存储过程从当前数据库中选择所有现有表
【发布时间】:2026-01-24 03:35:01
【问题描述】:

我仍在尝试解决这个 Mysql 问题。我不是 dba,但需要弄清楚如何去做。

我需要对当前数据库中的所有 (50k) 个现有表运行一个 select 语句。 请注意,union 对我来说不是正确的方法,因为我有超过 50k 表,我需要用循环解决这个问题。

到目前为止,我一直在尝试两种方法,但均未成功:

首先:使用子查询和information_schemma like:

Select * 
from 
    (SELECT TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES  
     WHERE table_schema = 'my_db')

Select * from (show tables;);

第二:使用存储过程,如:

delimiter //
CREATE PROCEDURE get_all_tables()
BEGIN
  DECLARE a varchar(100); 
  DECLARE cur1 CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES  WHERE table_schema = 'my_db';
  OPEN cur1;

但两者都没有做我想做的事。

它会产生语法或概念错误。

顺便说一句:我已经使用外部 perl 脚本解决了这个问题,该脚本执行“显示表”并运行带有循环的选择。

这没关系,但我认为这应该用纯mysql来解决。

欢迎任何想法。

狮子座。

【问题讨论】:

标签: mysql stored-procedures


【解决方案1】:
SELECT * FROM (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
  WHERE table_schema = 'my_db')

首先,您不能在任何 SQL 实现中执行此操作。查询必须在准备时知道表名,而不是在运行时。不能从字符串中选择,必须从表标识符中选择。

这就是这两个查询的区别:

SELECT * FROM MyTable    -- identifier
SELECT * FROM 'MyTable'  -- string value (this won't work)

顺便说一句,大多数编程语言都有类似的概念,即函数或类名不同于该函数或类的名称。您不能使用与按标识符执行函数相同的语法按名称执行函数。

<?php
$result = myFunction();
$result = 'myFunction'(); // nonsense

但有些语言确实有办法解决这个问题:

<?php
$funcName = 'myFunction';
$result = $funcName();

在 SQL 中,您可以通过在构建新 SQL 查询时使用表名作为字符串来绕过此限制。然后在运行时准备并执行该 SQL 查询字符串。这称为动态 SQL 查询。

但是就像上面使用变量存储函数名称的 PHP 示例一样,使用动态 SQL 需要多个步骤。您不能将查询合并到使用结果的同一查询中。

您的存储过程在正确的轨道上打开了一组表名的游标。但是您不能从存储过程中的动态 SQL 语句中打开游标。

您可以使用 PHP 或 Python 等脚本语言中的动态 SQL 轻松完成所需的工作。

【讨论】:

  • 亲爱的比尔,感谢您的回复!!!我将阅读更多有关程序的内容。问候。