我有以下存储过程来重置自动增量,以获得许多插入和删除的表。
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
我有两个问题。
显然......为什么我会收到这个错误 - 列清楚就在那里。
id列在6小时内增加到一百万,全天有很多插入/删除操作。有没有更好的方法来重置mysql中的auto_increments?
答案 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 $$;