[英]Loop through all tables and rename a column
客户端给了我一个遗留数据库old_data
,其中包含一堆表,我将逐步在新系统中激活这些表。 不幸的是,有几个表包含一个名为hash
的列,它不能很好地与Ruby on Rails一起浮动,我用它来处理这个项目。
有没有办法告诉MySQL控制台中的MySQL(版本8.0.12)循环遍历给定数据库中的所有表,如果该列存在, old_hash
列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 ab ...
语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.