|
Shawn wrote >I have a 2.1GB database with all InnoDB tables in it that I wanted to >change the name of. It took me longer to write my RENAME TABLE >script than it did to actually move the data. It's easier & less error-prone to do it in an sproc which prepares & executes the rename cmds. Only hitch is that MySQL doesn't yet let you prepare a drop database cmd. SET GLOBAL log_bin_trust_routine_creators=TRUE; DROP PROCEDURE IF EXISTS RenameDatabase; DELIMITER | CREATE PROCEDURE RenameDatabase (IN oldname CHAR(64), IN newname CHAR(64)) BEGIN DECLARE sname CHAR(64) DEFAULT NULL; DECLARE rows INT DEFAULT 1; CREATE DATABASE IF NOT EXISTS newname; REPEAT SELECT table_name INTO sname FROM information_schema.tables AS t WHERE t.table_schema = oldname LIMIT 1; SET rows = FOUND_ROWS(); IF rows = 1 THEN SET @scmd = CONCAT( 'RENAME TABLE ', oldname, '.', sname, ' TO ', newname, '.', sname ); PREPARE cmd FROM @scmd; EXECUTE cmd; DEALLOCATE PREPARE cmd; ELSE SET @scmd = CONCAT( "UPDATE mysql.db SET Db = '", @newname, "' WHERE Db = '", @oldname, "'" ); PREPARE cmd FROM @scmd; EXECUTE cmd; SET @scmd = CONCAT( "UPDATE mysql.columns_priv SET Db = '", @newname, "' WHERE Db = '", @oldname, "'" ); PREPARE cmd FROM @scmd; EXECUTE cmd; DEALLOCATE PREPARE cmd; FLUSH PRIVILEGES; -- MySQL does not yet support PREPARE DROP DATABASE: -- SET @scmd = CONCAT( 'DROP DATABASE ', oldname ); -- PREPARE cmd FROM @scmd; -- EXECUTE cmd; -- DEALLOCATE PREPARE cmd; END IF; UNTIL rows = 0 END REPEAT; END; | DELIMITER ; PB ----- [EMAIL PROTECTED] wrote: Robert L Cochran <[EMAIL PROTECTED]> wrote on 10/17/2005 07:37:26 AM: |
No virus found in this outgoing message. Checked by AVG Anti-Virus. Version: 7.0.344 / Virus Database: 267.12.2/137 - Release Date: 10/16/2005
-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
