MySQL:在存储过程中准备语句 - 参数错误1064

时间:2014-06-11 08:31:54

标签: mysql stored-procedures prepared-statement parameter-passing mysql-error-1064

我正在为我们的迁移功能创建一个sql脚本。我们希望将数据从一个magento-instance迁移到另一个magento-instance(使用纯SQL,因为magento的导入/导出非常有限)。

其中一个挑战是我想动态地改变表的AUTO_INCREMENT值,因此不需要在多个步骤中手动完成。我想将AUTO_INCREMENT值设置为相应列的当前最大值+ 1。

我为此准备了以下存储过程:

    DELIMITER $$

    CREATE PROCEDURE alter_auto_inc_customer()
    BEGIN

      SELECT @max := MAX(entity_id)+ 1 FROM customer_entity;

      PREPARE stmt FROM 'ALTER TABLE customer_entity AUTO_INCREMENT = ?';
      EXECUTE stmt USING @max;

    END $$

此命令运行顺利。之后,只需通过简单的声明调用该过程:

CALL alter_auto_inc_customer();

当我执行“call”-statement时,我收到1064语法错误。这可能是微不足道的,但我无法弄清楚我的生活......

ERROR 1064 (42000): 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 '?' at line 1

有谁知道问题是什么?

我需要将它放到一个或多个存储过程中,因为我需要能够为数据库中的多个表运行类似的语句。

1 个答案:

答案 0 :(得分:0)

您可以使用触发器在插入数据之前获取最大值+ 1,而不是更改表结构:

DELIMITER $$
DROP TRIGGER IF EXISTS custom_autoincrement_bi$$

CREATE TRIGGER custom_autoincrement_bi BEFORE INSERT ON customer_entity
FOR each ROW
BEGIN

   SET NEW.entity_id = select max(entity_id) + 1 from customer_entity;

END$$

DELIMITER ;

但是如果你想从存储过程中改变表

DELIMITER $$

CREATE PROCEDURE alter_auto_inc_customer()
BEGIN

  SELECT MAX(entity_id) + 1 into @max FROM customer_entity;
  set @sql = concat('ALTER TABLE customer_entity AUTO_INCREMENT = ', @max);
  PREPARE stmt FROM @sql;
  EXECUTE stmt ;
  DEALLOCATE PREPARE stmt;

END $$