【问题标题】:Renaming Database Tables Error in SQLSQL中重命名数据库表错误
【发布时间】:2013-12-29 23:38:07
【问题描述】:

我正在尝试使用此处给出的答案重命名我的数据库表:

How To have Dynamic SQL in MySQL Stored Procedure

但是当我尝试在 phpMyAdmin SQL 选项卡中运行以下命令时出现 sql 错误:

delimiter // 
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
    SET @s = CONCAT('SELECT 'RENAME TABLE ', 
             GROUP_CONCAT('', TABLE_SCHEMA, ''.'', TABLE_NAME,
             ' TO ', TABLE_SCHEMA, ''='.osx_''', TABLE_NAME, '')) AS q
             FROM 
             information_schema.Tables WHERE TABLE_SCHEMA='my_database'';;'
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
//
delimiter ;

错误如下:

#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  
'RENAME TABLE ', GROUP_CONCAT('', TABLE_SCHEMA, ''.'', TABLE_NAME,' at line 3

我没有看到错误,请问有人能发现吗?

--编辑--

查看 Max 的答案后,我使用反引号重新格式化查询:

CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
    SET @s = SELECT
             CONCAT('RENAME TABLE ', 
             GROUP_CONCAT('`', TABLE_SCHEMA, '`.`', TABLE_NAME, 
             '` TO `', TABLE_SCHEMA, '`.`osx_', TABLE_NAME, '`')) AS q
             FROM 
             `information_schema`.`Tables` WHERE TABLE_SCHEMA=`my_database`;
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

从我发现的另一个示例中(见下文),我仍然收到 sql 错误:

#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 'SELECT
             CONCAT('RENAME TABLE ', 
             GROUP_CONCAT('`', TABLE_SCHEMA, '`.`',' at line 3 

我也尝试了另一个例子:

SELECT 
    CONCAT('RENAME TABLE ', 
    GROUP_CONCAT('`', TABLE_SCHEMA, '`.`', TABLE_NAME, 
    '` TO `', TABLE_SCHEMA, '`.`osx_', TABLE_NAME, '`')) AS q
FROM 
    `information_schema`.`Tables` WHERE TABLE_SCHEMA='my_database';

这会执行但会产生以下警告:

This table does not contain a unique column. 
Grid edit, checkbox, Edit, Copy and Delete features are not available.

并且不对数据库做任何事情。

帮助!

【问题讨论】:

  • 你可以通过 ssh 访问命令行吗?

标签: mysql dynamic-sql


【解决方案1】:
'SELECT 'RENAME

您已经用单引号打开了CONCAT() 的参数,当 MySQL 看到另一个参数时,它需要下一个参数。
您可以转义引号或对字符串文字使用双引号。

CONCAT('SELECT "RENAME TABLE ", GROUP_CONCAT( ...

【讨论】:

  • 我用一些额外的代码更新了我的问题。感谢您的帮助@Max Tsepkov
  • 这是 phpmyadmin 特定的。尝试使用mysql命令行界面。
  • 我不会总是在每种情况下都有可用的命令行,所以我需要一个可以在 phpMyAdmin 中工作的解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-12-04
  • 2018-01-27
  • 2022-06-15
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2010-09-15
相关资源
最近更新 更多