我仍在努力解决Mysql问题。我不是dba,但我需要弄清楚怎么做。
我需要在当前db的所有(50k)现有表上运行select语句。请注意,对于我来说,联合不是正确的方法,因为我有超过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脚本来解决这个问题,它执行一个“显示表”,并运行一个select循环。
这是可以的,但我认为这应该用纯mysql解决。
任何想法都是欢迎的。
利奥。
发布于 2016-11-21 21:43:36
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来完成所需的任务。
https://stackoverflow.com/questions/40729217
复制相似问题