【问题标题】:MySQL: prepared Statement in a stored Procedure - parameter error 1064MySQL:存储过程中的准备语句 - 参数错误 1064
【发布时间】:2014-08-01 05:31:56
【问题描述】:

我正在为我们的迁移功能创建一个 sql 脚本。我们希望将数据从一个 magento 实例迁移到另一个(使用纯 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();

当我执行“调用”语句时,我得到一个 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

有人知道问题是什么吗?

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

【问题讨论】:

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


    【解决方案1】:

    您可以在插入数据之前使用触发器来获取最大值 + 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 $$
    

    【讨论】:

    • 嗨,这是一种可行的解决方法,但我想使用一个过程。正如我所说,我需要使用多个表来执行此操作,并且我想通过一次调用(而不是多个触发器)来处理所有这些
    • 我修改了我的答案,添加了一些更改的存储过程。
    • 你的程序就像一个魅力。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多