使用准备好的语句将多个带前缀的表移动到存档数据库,为啥这个 MySQL 语句无效?

Posted

技术标签:

【中文标题】使用准备好的语句将多个带前缀的表移动到存档数据库,为啥这个 MySQL 语句无效?【英文标题】:Move multiple tables with prefix to archive database with prepared statement, why is this MySQL statement invalid?使用准备好的语句将多个带前缀的表移动到存档数据库,为什么这个 MySQL 语句无效? 【发布时间】:2014-06-13 12:31:11 【问题描述】:

我正在尝试将多个表从一个数据库移动到另一个数据库并将它们存档,但是下面的语句失败,选择时出现语法错误:

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 '@tbls ENGINE=archive RENAME @tbls.database_two' at line 1

select 语句与手册中建议的语法相同,而且我似乎也没有遇到大写错误。

我错过了什么?

SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (
    SELECT GROUP_CONCAT(TABLE_NAME)
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'database_one'
    AND TABLE_NAME LIKE 'prefix_%'
);
SET @rnStmt = CONCAT('ALTER TABLE @tbls ENGINE=archive RENAME @tbls.database_two');
-- SELECT @rnStmt;
PREPARE stmt FROM @rnStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

MySQL 5.1 CentOS 6.5

编辑:复制了错误的错误信息

更新:取得了一些进展,选择工作和语法检查,但我在准备语句中得到“未选择数据库”。

SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (
    SELECT GROUP_CONCAT(TABLE_NAME)
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'database_one'
    AND TABLE_NAME LIKE 'prefix_%'
);
SET @rnStmt = CONCAT('ALTER TABLE ', @tbls, ' ENGINE=archive RENAME database_two.', @tbls);
PREPARE stmt FROM @rnStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我尝试过 USE 和其他一些变体,但没有成功。

【问题讨论】:

SELECT GROUP_CONCAT(TABLE_NAME 之后缺少) 你需要其中之一“)”(错误消息告诉你) 这是一个发布错误,我正在尝试在 Notepadd++ 中构造语句并将其复制到浏览器中,这有点破坏了格式。发生同样的错误。是因为我使用了两次变量名吗?不确定这是否允许。 【参考方案1】:

对于多张表需要使用RENAME TABLE语句,并且需要收集完整的当前表名和完整的新表名,然后构造结果查询并执行-

SELECT
  GROUP_CONCAT(CONCAT('database_one.',TABLE_NAME)),
  GROUP_CONCAT(CONCAT('database_two.',TABLE_NAME))
INTO
  @from, @to
FROM
  information_schema.TABLES
WHERE
  TABLE_SCHEMA = 'database_one' AND TABLE_NAME LIKE 'prefix_%';

SET @rnStmt = CONCAT('RENAME TABLE ', @from, ' TO ', @to);

PREPARE stmt FROM @rnStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

【讨论】:

这太好了,谢谢。我在一分钟前通过删除引擎规范让它工作,但它有一些其他意想不到的后果,所以我没有将它作为解决方案发布。 最后一个问题。如果我要在几个(100 多个)表上尝试此操作并将它们转换为存档,我是否需要使用存储过程? >将它们转换为档案 - 你是什么意思? 存档存储引擎,这些表正在退役,但数据要保留。 在这种情况下,您应该为每个表生成多个 ALTER TABLE 语句。你可以用同样的方法来做。

以上是关于使用准备好的语句将多个带前缀的表移动到存档数据库,为啥这个 MySQL 语句无效?的主要内容,如果未能解决你的问题,请参考以下文章

PDO - 使用准备好的语句将所有 sql 数据放入 html 表中

在哪里使用 JDBC 创建准备好的语句?

在 PHP 中到处使用准备好的语句? (PDO)

如何将多个 INSERT INTO 与准备好的语句结合起来?

如何在for循环中执行准备好的语句以从jsp中的表中获取数据?

准备好的语句和浮点数