3

我试图让 MySql 将以下语句的结果作为进一步的 sql 语句执行。我相信在 oracle sqlplus 中这是使用该spool功能实现的。这是如何在Mysql中实现的?

select concat('OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.',  ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist where table_schema = 'my_schema';
4

2 回答 2

5

您必须使用准备好的语句

SET @s:='';
SELECT @s:=concat(@s, 'OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.',  ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist where table_schema = 'my_schema';    
PREPARE stmt FROM @s;
EXECUTE stmt;

DEALLOCATE PREPARE stmt;

但是您必须将所有优化表语句放入一个变量中,这就是我@s与自身连接的原因。否则,您必须使用光标,这是不必要的工作。

从 MySQL 5.0.23 开始,支持以下附加语句:

ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE

编辑:一个更简单的方法是:

SELECT CONCAT('OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.',  ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist WHERE table_schema = 'my_schema'
INTO OUTFILE '/tmp/my_optimization';
SOURCE 'tmp/my_optimization';
于 2013-04-15T11:49:50.157 回答
1

如果您通过 mysql 命令行客户端访问它,您可以再次将第一个命令的输出通过管道传输到 cli 工具中。

mysql --batch --silent -nBe "select concat('OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.',  ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist where table_schema = 'my_schema'" | mysql my_schema
于 2019-06-06T11:38:51.070 回答