我仍在尝试解决这个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解决。
任何想法都会受到欢迎。
利奥。
答案 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轻松地完成所需的操作。