如何迭代结果集并执行每个语句? (MySQL的)

时间:2015-11-25 22:57:42

标签: mysql sql loops

这是我的疑问:

SELECT CONCAT('ALTER TABLE `', TABLE_NAME,'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS mySQL
FROM INFORMATION_SCHEMA.TABLES;

我想从整个数据库中更改每个varchar和table的charset和collat​​ion,但是结果集很大。如何迭代此查询并在SQL语言中执行每个结果?

1 个答案:

答案 0 :(得分:2)

如果我这样做,我会将此SELECT语句的输出保存到文件类型为.sql的文件中。

然后我会用文本编辑器编辑.sql文件,以确保它包含我希望的内容。

然后我会使用MySQL客户端程序来运行SQL文件。

注意您的查询编写的SQL数据定义语言命令无法正常工作。您的查询为系统中的每个表写入命令。您可能希望对一个数据库中的表执行此操作。

SELECT CONCAT('ALTER TABLE `',
              TABLE_SCHEMA,
              '``',
              TABLE_NAME,
              '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') 
                     AS mySQL
  FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA = DATABASE()
   AND TABLE_SCHEMA NOT IN ('INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA', 'MYSQL')

此查询使用数据库名称限定表名。它还仅选择当前数据库中的表。最后,它排除了三个系统数据库,因为尝试更改这些数据库中的表是一个非常糟糕的主意。