MYSQL 和 innoDB 动态改变表的 AUTO_INCREMENT

标签 mysql innodb auto-increment mysql-5.7

我有一个问题,例如在我的系统中我有下一张表:

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 );

这会导致我出错(#1064)。阅读文档告诉我:

In MySQL, you cannot modify a table and select from the same table in a subquery.

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;

但是,这会导致错误 :(。

最佳答案

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;

关于MYSQL 和 innoDB 动态改变表的 AUTO_INCREMENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24439187/

相关文章:

mysql - 如何使用更新将 BLOB 数据附加/连接到 BLOB 列?

java - SQL 错误 : 0, SQLState:空

MySQL 存储引擎决策

java - 将数据库引擎从 MyIsam 更改为 innoDB 时出错

mysql - 在 innodb 中重置 auto_increment

未创建 MySQL 二进制日志文件 - Windows XP

mysql分隔符问题

mysql - key '6343' 的重复条目 'PRIMARY'

mysql - Auto_Increment 不适用于插入查询

android - SQLite 主键自动增量不起作用