【发布时间】: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