Перебрать все таблицы и переименовать столбец - PullRequest
0 голосов
/ 26 сентября 2018

Клиент дал мне устаревшую базу данных old_data, которая содержит набор таблиц, которые я собираюсь активировать в новой системе шаг за шагом.К сожалению, пара таблиц содержит столбец с именем hash, который плохо работает с Ruby on Rails, который я использую для решения этого проекта.

Есть ли способ сообщить MySQL (версия 8.0.12) в консоли MySQL перебрать все таблицы в данной базе данных и переименовать столбец от hash до old_hash, если этот столбец существует?

1 Ответ

0 голосов
/ 26 сентября 2018

К счастью, 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 ... оператор, который включает полное определение столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...