【问题标题】:MYSQL & innoDB alter dynamically AUTO_INCREMENT of a tableMYSQL & innoDB 动态改变表的 AUTO_INCREMENT
【发布时间】: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 值执行算术运算与规范化无关。

标签: mysql innodb auto-increment mysql-5.7


【解决方案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;

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2015-10-12
    • 2013-06-28
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2012-03-12
    • 2013-12-11
    • 2011-04-05
    相关资源
    最近更新 更多