将表转换为指定的引擎

时间:2014-02-10 15:03:17

标签: mysql sql procedure

我想创建一个过程,将指定数据库和特定引擎中的所有表转换为不同的引擎。

这就是我所拥有的:

DELIMITER //

DROP PROCEDURE IF EXISTS CONVERT_TABLES //

CREATE PROCEDURE CONVERT_TABLES
(
    IN db_name CHAR(255),
    IN engine_from CHAR(255),
    IN engine_to CHAR(255)
)
BEGIN

    DECLARE done INT DEFAULT FALSE;
    DECLARE table_name CHAR(255);

    DECLARE db_tables CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = db_name COLLATE utf8_unicode_ci AND ENGINE = engine_from COLLATE utf8_unicode_ci;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN db_tables;

    loop_tables: LOOP

        FETCH db_tables INTO table_name;

        IF done THEN
            LEAVE loop_tables;
        END IF;

        SET @sql = CONCAT('ALTER TABLE ', db_name, '.', table_name, ' ENGINE = ', engine_to );
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DROP PREPARE stmt;

    END LOOP;

END //
DELIMITER;

CALL CONVERT_TABLES( "dp_dev_web7", "MyISAM", "InnoDB" );

但是我收到了这个错误:

  

1064 - 您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以获得正确的语法,以便在' NULL'附近使用在第1行

//编辑:修复了整理错误,更新了代码

1 个答案:

答案 0 :(得分:1)

看起来你正在比较不同排序规则的字符串。修复您需要更改数据库结构中的排序规则或使用COLLATE动态更改它:

WHERE TABLE_SCHEMA COLLATE utf8_general_ci = IFNULL(db_name,"")  COLLATE utf8_general_ci AND ENGINE COLLATE utf8_general_ci = IFNULL(engine_from,"") COLLATE utf8_general_ci