我正在为我们的迁移功能创建一个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
有谁知道问题是什么?
我需要将它放到一个或多个存储过程中,因为我需要能够为数据库中的多个表运行类似的语句。
答案 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 $$