mysql - 循环遍历所有表并重命名列
问题描述
一个客户给了我一个旧数据库old_data
,其中包含一堆表,我将在新系统中逐步激活这些表。不幸的是,有几个表包含一个名称的列,hash
它不能很好地与我用来处理这个项目的 Ruby on Rails 一起浮动。
有没有办法在 MySQL 控制台中告诉 MySQL(版本 8.0.12)循环遍历给定数据库中的所有表并将列重命名为该列hash
是否old_hash
存在?
解决方案
幸运的是 MySQL 8 附带了一种ALTER TABLE RENAME COLUMN a TO b
语法,因此您可以编写一个相当简单的存储过程来执行此操作。
DELIMITER //
CREATE PROCEDURE rename_columns(IN name_of_database CHAR(64),
IN old_name_of_column CHAR(64),
IN new_name_of_column CHAR(64))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE name_of_table CHAR(64);
DECLARE table_cursor CURSOR FOR
SELECT TABLE_NAME FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = name_of_database AND COLUMN_NAME = old_name_of_column;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN table_cursor;
table_loop: LOOP
FETCH table_cursor INTO name_of_table;
IF done THEN LEAVE table_loop; END IF;
SET @alter_sql = CONCAT(
'ALTER TABLE ', name_of_database, '.', name_of_table,
' RENAME COLUMN ', old_name_of_column, ' TO ', new_name_of_column);
PREPARE alter_statement FROM @alter_sql;
EXECUTE alter_statement;
DEALLOCATE PREPARE alter_statement;
END LOOP;
CLOSE table_cursor;
END//
DELIMITER ;
CALL rename_columns('old_data', 'hash', 'old_hash');
它在 5.7 和更早版本中更加复杂,因为您需要生成一个ALTER TABLE CHANGE a b ...
包含完整列定义的语句。
推荐阅读
- html - 如何使用 ng-class 为 HTML 标签添加 ID(选择器)
- python - 在 python 中从两个具有 X 和 Y 值的 CSV 文件创建单个 CSV
- python - 如何在nodejs中自动启动和停止python脚本?
- python-3.x - Apache Tika 服务器问题,无法读取 PDF 文件
- swift - 导入到 XCode 的 Collada (.dae) 文件显示没有纹理
- continuous-integration - VSTS 将文件复制到本地驱动器时出错
- meteor - Atmospherejs.com repo 搜索现在 3 天不可用?
- hadoop - HBase 表数据转换为 CSV
- javascript - 如何迭代存在于另一个方法中的一组对象?
- apache-kafka - 如何流式传输到全局 Kafka 表