我试图让 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';
我试图让 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';
您必须使用准备好的语句。
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';
如果您通过 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