仅在MyISAM表中更改mysql中的表

时间:2016-03-24 13:48:14

标签: mysql sql database innodb myisam

我试图将所有mysql MyISAM表转换为InnoDB而不选择已经在InnoDB中。

我使用此查询有6734行(MyISAM格式的表格):

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'MyISAM';

我使用此查询有11218行(InnoDB格式的表格):

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'InnoDB';

所以我想在MyISAM中连接表的每个结果,仅作为子查询传递:

ALTER TABLE table_name ENGINE = InnoDB;

如何实现这一目标?选择子查询?我的目的是避免处理已经转换为innodb的因为如果我按照以下方式制作脚本需要花费更多的时间:

for db in `echo "show databases"| mysql`;
do
echo $db

echo 'SHOW TABLES;' \
 | mysql -D $db \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \
 | mysql -D $db
echo 'finish';
done;

1 个答案:

答案 0 :(得分:1)

您可以直接在SQL中创建ALTER语句。如果你有更多的SCHEMAS要忽略,你可以在IN子句中添加它们。

SELECT
  CONCAT ('ALTER TABLE `',TABLE_SCHEMA, '`.`' ,TABLE_NAME,'` ENGINE = InnoDB;') as newsql
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE'
  AND TABLE_SCHEMA NOT IN ('mysql')
  AND `ENGINE` = 'MYISAM';

与shell一起使用:

echo "SELECT CONCAT ('ALTER TABLE \`',TABLE_SCHEMA, '\`.\`' ,TABLE_NAME,'\` ENGINE = InnoDB;')  FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('mysql') AND \`ENGINE\` = 'MYISAM';" |mysql --skip-column-names |mysql