在存储过程调用

时间:2015-10-01 21:28:18

标签: mysql stored-procedures

我有以下存储过程来重置自动增量,以获得许多插入和删除的表。

DROP PROCEDURE IF EXISTS reset_autoincrement;
DELIMITER $$;
CREATE PROCEDURE reset_autoincrement(IN tableName VARCHAR(250))
BEGIN
      SELECT @max :=  MAX(`id`) + 1 + concat(' FROM ', tableName ); 
      set @alter_statement = concat('ALTER TABLE ', tableName ,' AUTO_INCREMENT = ', @max);
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END $$;

并用

调用它
call reset_autoincrement('queueIn');

并获取

  

23:18:25调用reset_autoincrement('queueIn')错误代码:1054。'字段列表'中的未知列'id'0,042秒

表格列的一小段摘录:

id  bigint(19) UN AI PK
created_at  timestamp
updated_at  timestamp

我有两个问题。

  1. 显然......为什么我会收到这个错误 - 列清楚就在那里。

  2. id列在6小时内增加到一百万,全天有很多插入/删除操作。有没有更好的方法来重置mysql中的auto_increments?

1 个答案:

答案 0 :(得分:2)

因为你试图让它成为一个动态查询(下面一行),并且它目前处于动态和普通查询的混合状态。

SELECT @max :=  MAX(`id`) + 1 + concat(' FROM ', tableName );

您应该完全使其成为动态查询

SET @sql = "SELECT MAX(`id`) + 1 FROM " + tableName;

您需要保存第一个动态查询中的变量,并在ALTER语句中使用它。像下面的东西

DELIMITER $$;
CREATE PROCEDURE reset_autoincrement(IN tableName VARCHAR(250))
BEGIN
      SET @var1 = 0;
      SET @sql = "SELECT MAX(`id`) + 1 INTO @var1 FROM " + tableName; 
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      SET @ID = @var1;
      set @alter_statement = concat('ALTER TABLE ', tableName ,' AUTO_INCREMENT = ', @ID);
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END $$;