簡體   English   中英

MYSQL和innoDB動態地改變表的AUTO_INCREMENT

[英]MYSQL & innoDB alter dynamically AUTO_INCREMENT of a table

我有一個問題,例如在我的系統中我有下一個表:

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 ,fe:

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

我嘗試使用whit變量:

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;

感謝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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM