MYSQL & innoDB 动态改变 AUTO_INCREMENT 的表

标签: MySQL
发布时间: 2017/1/9 21:31:18
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个问题,例如在我的系统我有下表︰

CREATE TABLE `sales` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `amount` FLOAT NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- is more complex table

内容︰

+-----+-------+
| id  | amount|
+-----+-------+
|2023  |  100 |
|2024  |  223 |
|2025  |  203 |
|...          |
|2505  |  324 |
+-----+-------+

我不知道当前的 id (有销售每一天)。我试图规范表。

UPDATE  sales SET id=id - 2022;

结果︰

+-----+-------+
| id  | amount|
+-----+-------+
|   1  |  100 |
|   2  |  223 |
|   3  |  203 |
|...          |
| 482  |  324 |
+-----+-------+

问题

我的问题试图改变 AUTO_INCREMENT ,远东财务︰

ALTER TABLE sales AUTO_INCREMENT = 483;

其正确的但我不知道当前的 id: (,我试试下面的查询︰

ALTER TABLE sales AUTO_INCREMENT = (SELECT MAX(id) FROM sales );

这使我的 error(#1064)。阅读文档告诉我︰

在 MySQL,您不能修改表,选择从同一表中的子查询。

http://dev.mysql.com/doc/refman/5.7/en/subqueries.html

我试着白衣变量︰

SET @new_index = (SELECT MAX(id) FROM sales );
ALTER TABLE sales AUTO_INCREMENT = @new_index;

但是,这将导致一个错误: (。

解决方法 1:

ALTER TABLE必须有文本值中的语句进行语法分析的时候 (即在准备时间)。

你不能投入变量或参数的语句在分析时,但你可以把语句之前解析时间变量。这意味着使用动态 SQL:

SET @new_index = (SELECT MAX(id) FROM sales );
SET @sql = CONCAT('ALTER TABLE sales AUTO_INCREMENT = ', @new_index);
PREPARE st FROM @sql;
EXECUTE st;
赞助商