带有 ALTER TABLE 的存储过程

psa*_*e23 3 mysql stored-procedures

我需要在同一 MySQL 服务器上不同数据库中的两个表之间同步 auto_increment 字段。希望创建一个存储过程,其中管理员的权限可以让 Web 用户在ALTER TABLE [db1].[table] AUTO_INCREMENT = [num];不授予权限的情况下运行(这有点 SQL 注入的味道)。

我的问题是我在创建存储过程时收到错误。这是MySQL不允许的吗?

DROP PROCEDURE IF EXISTS sync_auto_increment;
CREATE PROCEDURE set_auto_increment (tableName VARCHAR(64), inc INT)
BEGIN
ALTER TABLE tableName AUTO_INCREMENT = inc;
END;

The*_*aot 5

为了扩展对Chibu答案评论的讨论......是的,您可以使用准备好的陈述。但你必须使用CONCATto 创建句子而不是使用PREPARE ... FROM ....

这是一个可行的解决方案:

DROP PROCEDURE IF EXISTS set_auto_increment;
DELIMITER //
CREATE PROCEDURE set_auto_increment (_table VARCHAR(64), _inc INT)
BEGIN
    DECLARE _stmt VARCHAR(1024);
    SET @SQL := CONCAT('ALTER TABLE ', _table, ' AUTO_INCREMENT =  ', _inc);
    PREPARE _stmt FROM @SQL;
    EXECUTE _stmt;
    DEALLOCATE PREPARE _stmt;
END//
DELIMITER;
Run Code Online (Sandbox Code Playgroud)

我是从 Michael McLaughlin 的文章“ Prepared Statement Failure”中了解到这一点的。