Mysql使用存储过程从当前数据库中选择所有现有表

时间:2016-11-21 20:56:30

标签: mysql stored-procedures

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

我需要在当前db的所有(50k)现有表上运行select语句。 请注意,对于我而言,union不是正确的方法,因为我有超过50k的表,我需要通过循环解决这个问题。

到目前为止,我一直尝试两种方法但没有成功:

首先:使用子查询和information_schemma之类的:

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脚本解决了这个问题,执行了一个" show tables"并运行带有循环的选择。

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

任何想法都会受到欢迎。

利奥。

1 个答案:

答案 0 :(得分:0)

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)

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

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

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

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

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

但是就像上面使用变量来存储函数名称的PHP示例一样,使用动态SQL需要多个步骤。您无法组合查询以将表名称放入使用结果的同一查询中。

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

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