Skip to content

Instantly share code, notes, and snippets.

@andreoss
Created January 23, 2025 15:52
Show Gist options
  • Save andreoss/e6df6ac642b8291f3f1095a2379a2390 to your computer and use it in GitHub Desktop.
Save andreoss/e6df6ac642b8291f3f1095a2379a2390 to your computer and use it in GitHub Desktop.
MySQL. Rename the database, i.e. create a new database and move all tables and views to it.
DELIMITER $
DROP PROCEDURE IF EXISTS sys.rename_database;
CREATE PROCEDURE sys.rename_database(IN old_schema VARCHAR(255), IN new_schema VARCHAR(255))
BEGIN DECLARE done INT DEFAULT FALSE;
DECLARE t VARCHAR(255);
DECLARE v VARCHAR(255);
DECLARE d TEXT;
DECLARE table_cursor CURSOR FOR
SELECT TABLE_NAME AS t FROM information_schema.TABLES WHERE TABLE_SCHEMA = old_schema AND TABLE_TYPE = 'BASE TABLE';
DECLARE view_cursor CURSOR FOR
SELECT TABLE_NAME, VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = old_schema;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN table_cursor;
read_loop: LOOP FETCH table_cursor INTO t;
IF done THEN LEAVE read_loop; END IF;
SET @code = CONCAT('RENAME TABLE `', old_schema, '`.`', t, '` TO `', new_schema, '`.`', t, '`;');
PREPARE stmt FROM @code;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE table_cursor;
SET done = FALSE;
OPEN view_cursor;
read_view_loop: LOOP FETCH view_cursor INTO v, d;
IF done THEN LEAVE read_view_loop; END IF;
SET @code = CONCAT('CREATE VIEW `', new_schema, '`.`', v, '` AS ', REPLACE(d, old_schema, new_schema), ';');
PREPARE stmt FROM @code;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE view_cursor;
END$
DELIMITER ;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment