簡體   English   中英

如何在 MySQL 中重置 AUTO_INCREMENT

[英]How to reset AUTO_INCREMENT in MySQL

如何重置字段的AUTO_INCREMENT

我希望它再次從1開始計數。

您可以使用以下方法重置計數器:

ALTER TABLE tablename AUTO_INCREMENT = 1

對於InnoDB ,您不能將auto_increment值設置為低於或等於當前最高索引。 (引自ViralPatel ):

請注意,您不能將計數器重置為小於或等於任何已使用的值。 對於 MyISAM,如果該值小於或等於 AUTO_INCREMENT 列中當前的最大值,則將該值重置為當前最大值加一。 對於 InnoDB,如果該值小於該列中當前的最大值,則不會發生錯誤,並且當前序列值不會改變。

請參閱如何使用另一個表中的 MAX 值重置 MySQL AutoIncrement? 關於如何動態獲得可接受的值。

ALTER TABLE tablename AUTO_INCREMENT = 1
SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

就像這樣:

ALTER TABLE tablename AUTO_INCREMENT = value;

參考: 13.1.9 ALTER TABLE 語句

在此處輸入圖像描述

在“操作”選項卡下使用phpMyAdmin有一個非常簡單的方法。 在表格選項中,您可以將自動增量設置為您想要的數字。

對我有用的最佳解決方案:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;

它很快,與 InnoDB 一起工作,我不需要知道當前的最大值!

這邊走。 自動遞增計數器將重置並從存在的最大值自動開始。

這個問題的評分最高的答案都推薦“ALTER yourtable AUTO_INCREMENT= value”。 但是,這僅在更改中的value大於自動增量列的當前最大值時才有效。 根據 MySQL 8 文檔

您不能將計數器重置為小於或等於當前使用的值。 對於 InnoDB 和 MyISAM,如果該值小於或等於 AUTO_INCREMENT 列中當前的最大值,則將該值重置為當前最大 AUTO_INCREMENT 列值加一。

本質上,您只能更改 AUTO_INCREMENT 以增加自動增量列的值,而不是將其重置為 1,正如 OP 在問題的第二部分中所問的那樣。 對於實際上允許您從當前最大值向下設置 AUTO_INCREMENT 的選項,請查看Reorder / reset auto increment primary key

從 MySQL 5.6 開始,您可以將簡單的 ALTER TABLE 與 InnoDB 一起使用:

ALTER TABLE tablename AUTO_INCREMENT = 1;

文檔已更新以反映這一點:

13.1.7 ALTER TABLE 語句

我的測試還表明該表沒有被復制。 值只是簡單地改變了。

How To Reset MySQL Autoincrement Column 中給出了很好的選擇

注意ALTER TABLE tablename AUTO_INCREMENT = value; 不適用於InnoDB的工作

您還可以像這樣使用語法TRUNCATE表:

TRUNCATE TABLE table_name

謹防! TRUNCATE TABLE your_table刪除your_table中的所有內容。

ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)

我在我的一些腳本中使用了它。 id 字段被刪除,然后使用以前的設置添加回來。 數據庫表中的所有現有字段都使用新的自動增量值填充。 這也應該適用於InnoDB

請注意,表中的所有字段都將被重新計算,並且將具有其他 ID!!!。

這是一個空表:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

如果你有數據,但你想整理一下,我建議使用這個:

ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD  `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);

這是我的解決方案,但如果您的列有約束或作為外鍵連接到其他表,我不建議這樣做,因為它會產生不良影響甚至不起作用。

第一:刪除列

ALTER TABLE tbl_name DROP COLUMN column_id

第二:重新創建列並將其設置為 FIRST,如果您希望它作為我假設的第一列。

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

從 MySQL 5.6 開始,由於在線 DDL (注意algorithm=inplace ),以下方法運行得更快:

alter table tablename auto_increment=1, algorithm=inplace;

SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;

要更新到最新的加一個 id:

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);

編輯:

SET @latestId = SELECT MAX(id) FROM table_name;
SET @nextId = @latestId + 1;
ALTER TABLE table_name AUTO_INCREMENT = @nextId;

未測試,請在運行前測試*

嘗試運行此查詢:

 ALTER TABLE tablename AUTO_INCREMENT = value;

或者試試這個查詢重置自動增量

 ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;

並設置自動增量,然后運行此查詢:

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

可以通過兩種方式(重新)設置表的自動增量計數器:

  1. 通過執行查詢,就像其他人已經解釋的那樣:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. 使用Workbench或其他可視化數據庫設計工具。 我將在 Workbench 中展示它是如何完成的——但在其他工具中也不應該有太大的不同。 通過右鍵單擊所需的表並從上下文菜單中選擇Alter table 在底部,您可以看到更改表格的所有可用選項。 選擇Options ,您將獲得此表格:

    在此處輸入圖像描述

然后只需在字段Auto increment中設置所需的值,如圖所示。 這將基本上執行第一個選項中顯示的查詢。

如果您使用PHPStorm's database tool ,您必須在database console中輸入:

ALTER TABLE <table_name> AUTO_INCREMENT = 0;

我試圖更改表並將 auto_increment 設置為 1,但它不起作用。 我決定刪除我正在遞增的列名,然后使用您的首選名稱創建一個新列,並將該新列設置為從一開始就遞增。

您可以簡單地截斷表格以重置序列:

TRUNCATE TABLE TABLE_NAME

我用谷歌搜索並找到了這個問題,但我真正想要的答案滿足兩個標准:

  1. 使用純 MySQL 查詢
  2. 將現有表自動增量重置為 max(id) + 1

因為我在這里找不到我想要的東西,所以我從各種答案中拼湊出答案並在這里分享。

有幾點需要注意:

  1. 有問題的表是 InnoDB
  2. 該表使用類型為int的字段id作為主鍵
  3. 純粹在 MySQL 中執行此操作的唯一方法是使用存儲過程
  4. 我下面的圖片使用 SequelPro 作為 GUI。 您應該能夠根據您喜歡的 MySQL 編輯器對其進行調整
  5. 我已經在 MySQL Ver 14.14 Distrib 5.5.61 上測試了這個,用於 debian-linux-gnu

第 1 步:創建存儲過程

創建一個這樣的存儲過程:

DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN

      SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
      PREPARE stmt FROM @get_next_inc;
      EXECUTE stmt;
      SELECT @next_inc AS result;
      DEALLOCATE PREPARE stmt;

      set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

然后運行它。

在運行之前,當您查看數據庫中的存儲過程時,它看起來像這樣。

在此處輸入圖像描述

當我運行時,我只需選擇存儲過程並按運行選擇

在此處輸入圖像描述

注意:分隔符部分至關重要。 因此,如果您復制並粘貼此問題中最熱門的答案,它們往往因此不起作用。

運行后,我應該看到存儲過程

在此處輸入圖像描述

如果需要更改存儲過程,則需要刪除存儲過程,然后選擇再次運行。

第二步:調用存儲過程

這次你可以簡單地使用普通的 MySQL 查詢。

call reset_autoincrement('products');

最初來自我自己在https://simkimsia.com/reset-mysql-autoincrement-to-max-id-plus-1/中的 SQL 查詢注釋,並適用於 Stack Overflow。

ALTER TABLE `table_name`   DROP `id`;

ALTER TABLE `table_name` ADD `id` INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`) ;

很快,首先我們刪除了 id 列,然后再次添加了主鍵 id ......

ALTER TABLE tablename AUTO_INCREMENT = 1

最好的方法是使用 AI 刪除字段並使用 AI 再次添加。 它適用於所有表。

您需要遵循 Miles M 評論中的建議,這里有一些PHP代碼可以修復 MySQL 中的范圍。 您還需要打開my.ini文件(MySQL)並將 max_execution_time=60 更改為 max_execution_time=6000; 對於大型數據庫。

不要使用“ALTER TABLE 表名 AUTO_INCREMENT = 1”。 它將刪除數據庫中的所有內容。

$con = mysqli_connect($dbhost, $dbuser, $dbpass, $database);
$res = mysqli_query($con, "select * FROM data WHERE id LIKE id ORDER BY id ASC");

$count = 0;
while ($row = mysqli_fetch_array($res)){
    $count++;

    mysqli_query($con, "UPDATE data SET id='".$count."' WHERE id='".$row['id']."'");
}
echo 'Done reseting id';
mysqli_close($con);

我建議您轉到查詢瀏覽器並執行以下操作:

  1. 轉到 schemata 並找到要更改的表。

  2. 右鍵單擊並選擇復制創建語句。

  3. 打開一個結果選項卡並粘貼其創建語句。

  4. 轉到 create 語句的最后一行並查找 Auto_Increment=N,(其中 N 是 auto_increment 字段的當前編號。)

  5. 將 N 替換為 1。

  6. Ctrl + Enter

在表中輸入新行后, Auto_increment應重置為 1。

我不知道如果您嘗試添加已經存在auto_increment 字段值的行會發生什么。

暫無
暫無

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

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