重命名表准备声明

时间:2015-05-07 21:15:09

标签: mysql sql stored-procedures prepared-statement

我试图在MySQL中编写一个存储过程,根据指定的前缀删除和重命名表(在这种情况下,' migrate _')。代码应递归重命名所有以' migrate _'开头的表。但是,在尝试运行它时,我没有留下任何错误。

BEGIN

SELECT COUNT(*) INTO @num_migrate
FROM information_schema.tables a 
WHERE a.table_name LIKE 'migrate_%';

IF (@num_migrate > 0) THEN
    SELECT concat( 'USE `md_rails`; DROP TABLE IF EXISTS `', 
            Replace(tbls.table_name,'migrate_',''), '`; ', 
        'RENAME TABLE `', tbls.table_name, '` TO `', 
            Replace(tbls.table_name,'migrate_',''), '`;' ) INTO @b
    FROM information_schema.tables tbls
    WHERE tbls.table_name LIKE 'migrate_%' LIMIT 1;
    PREPARE stmt FROM @b;
    EXECUTE stmt;
    CALL handle_migrated_tables();
END IF;


END

我得到的错误是:

Error Code: 1064. You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use 
near 'DROP TABLE IF EXISTS second_test; RENAME TABLE migrate_second_test TO 
second_tes' at line 1

我已经尝试自行运行select语句生成的代码,它可以满足我的需求,但由于某种原因,它在预备语句中并不喜欢它。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

Lashane说对了!如果有人想知道,这是最终(工作)代码:

CREATE PROCEDURE `handle_migrated_tables`()
    BEGIN
        SET max_sp_recursion_depth=50;

        SELECT COUNT(*) INTO @num_migrate
        FROM information_schema.tables a 
        WHERE a.table_name LIKE 'migrate_%';

        IF (@num_migrate > 0) THEN

            SELECT tbls.table_name INTO @tbl
            FROM information_schema.tables tbls
            WHERE tbls.table_name LIKE 'migrate_%' LIMIT 1;

            SET @a = concat('DROP TABLE IF EXISTS md_rails.', Replace(@tbl, 'migrate_', ''));
            PREPARE stmt FROM @a;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;

            SET @b = concat('RENAME TABLE md_rails.', @tbl, ' TO ', Replace(@tbl, 'migrate_', ''));
            PREPARE stmt FROM @b;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;        

            CALL handle_migrated_tables();
        END IF;


    END
相关问题