MYSQL & innoDB 动态改变表的 AUTO_INCREMENT
Posted
技术标签:
【中文标题】MYSQL & innoDB 动态改变表的 AUTO_INCREMENT【英文标题】:MYSQL & innoDB alter dynamically AUTO_INCREMENT of a table 【发布时间】:2014-08-17 19:37:42 【问题描述】:我有一个问题,例如在我的系统中我有下一张表:
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
, f.e.:
ALTER TABLE sales AUTO_INCREMENT = 483;
它是正确的,但我不知道当前的 id :(,我尝试以下查询:
ALTER TABLE sales AUTO_INCREMENT = (SELECT MAX(id) FROM sales );
这会导致我出现错误(#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;
但是,这会导致错误:(。
【问题讨论】:
对代理 ID 值执行算术运算与规范化无关。 【参考方案1】:ALTER TABLE
在解析语句时(即准备时)必须包含文字值。
不能在解析时将变量或参数放入语句中,但可以在解析时before将变量放入语句中。这意味着使用动态 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;
【讨论】:
谢谢比尔·卡尔文 :¬),【参考方案2】:感谢Bill Karwin,我的问题是:
SET @sales_init = 2022;
DELETE FROM `sales` WHERE `sales`.`id` <= @sales_init;
UPDATE sales SET id=id - @sales_init;
-- set new index for sales
SET @new_init = (SELECT MAX(id) + 1 FROM sales );
SET @query = CONCAT("ALTER TABLE sales AUTO_INCREMENT = ", @new_init);
PREPARE stmt FROM @query;
EXECUTE stmt;
【讨论】:
以上是关于MYSQL & innoDB 动态改变表的 AUTO_INCREMENT的主要内容,如果未能解决你的问题,请参考以下文章