【问题标题】:rename table prepared statement重命名表准备语句
【发布时间】:2015-05-07 21:15:08
【问题描述】:

我正在尝试在 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 语句生成的代码,它可以满足我的需要,但由于某种原因,它不喜欢在准备好的语句中使用它。

任何帮助将不胜感激!

【问题讨论】:

  • 你在sql查询中有2条语句,尝试拆分它
  • 您确定可以PREPARE 多个语句吗? The documentation 似乎暗示你不能。不过,您可以创建一个存储过程。此外,您只是在这里迭代,而不是递归
  • @tadman,存储的过程名称是handle_migrated_tables,抱歉我一开始没有指定。
  • @Lashane 就是这样!如果您将您的评论作为答案发表,我可以接受(我认为这就是 stackoverflow 的工作原理?)感谢您的帮助!

标签: mysql sql stored-procedures prepared-statement


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 2021-11-18
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多