MySQLでAUTO_INCREMENTをリセットする方法は?


1246

フィールドのをリセットするにAUTO_INCREMENTはどうすればよいですか?もう一度
数え始めて欲しい1



80
おそらくテーブルも空にしたいと思うでしょう:TRUNCATE TABLE yourTableName;
Konerak '19年


3
はい、この場合はテーブルを切り捨てるのが最適です。それを1にもリセット自動インクリメントスタート
raidsan

2
DRUNC権限が必要なため、TRUNCATEする権限がない場合があります。
Luke Cousins

回答:


2024

次のコマンドでカウンターをリセットできます。

ALTER TABLE tablename AUTO_INCREMENT = 1

InnoDBの場合auto_increment、現在の最高インデックス以下の値を設定することはできません。(ViralPatelからの引用):

カウンタは、すでに使用されている値以下にリセットできないことに注意してください。MyISAMの場合、値が現在AUTO_INCREMENT列にある最大値以下の場合、値は現在の最大値に1を加えた値にリセットされます。InnoDBの場合、値が列の現在の最大値より小さい場合、エラーは発生せず、現在のシーケンス値は変更されません。

別のテーブルのMAX値を使用してMySQL AutoIncrementをリセットする方法を参照してください許容値を動的に取得する方法について。


8
これは、テーブルがいっぱいになると永遠にかかることがあります。これには注意してください:stackoverflow.com/questions/2681869/...
BT

52
これはcircular reference
Besnik

5
どういう意味curcular referenceですか?
Niels

73
MySqlは同じ構造と新しいauto_increment値で新しいテーブルを作成し、元のテーブルからすべてのレコードをコピーし、元のテーブルを削除して新しいテーブルの名前を変更することに注意してください。テーブルが大きい場合、これは本番環境のパフォーマンス(およびディスク領域)に大きな影響を与える可能性があります。
Rostol 2013

6
すでにAUTOINCREMENT列がある場合、この高い投票数の回答は本当に機能しますか?MySQL 5.1のドキュメントによれば、「カウンタは、すでに使用されている値以下にリセットすることはできません。MyISAMの場合、値が現在AUTO_INCREMENTカラムにある最大値以下の場合、値は現在の最大値に1を加えた値にリセットされます。InnoDBの場合、値が列の現在の最大値より小さい場合、エラーは発生せず、現在のシーケンス値は変更されません。
自動

160
ALTER TABLE tablename AUTO_INCREMENT = 1

7
あなたの答えと前の答えの違いは何でしょうか
Praveen Srinivasan 2015

30
@PraveenSrinivasan違いはありません。同時に追加しました
boobiq 2015

79
個人的には、AUTO_INCREMENTの質問に対するこれら2つの回答に同時実行の衝突があったのは素晴らしいことだと思います:-)
Mark Goldfain

@MarkGoldfainはいそうです!
ncomputers 2017年

同時実行はmysqlの競合状態を引き起こします...
Syamsoul Azrien

81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

これでうまくいくと思います


2
この質問にはすでに適切な答えがあります。さらに、列のUPDATEすべての値を更新しidます。
カーミット2014年

2
OPは、既存の行を並べ替えているとは述べていません。
カーミット2014年

完全で完璧な答え。しかし、新しい値を挿入すると、その値のPKがどうなるか疑問に思っています。1か次のPKか?
Prifulnath 2017年

ええ、これが最良のソリューションですが、プロダクションテーブルなど、データが書き込まれている場合はテーブルをロックする必要があるかもしれません
wavvves

非常に役に立ちました。1から開始するために自動インクリメントをリセットする必要があるのと同じ要件がありましたが、最初の2つのコマンドのみが役立ちました。
LOKENDRA


40

ここに画像の説明を入力してください「操作」タブの下のphpmyadminを使用する非常に簡単な方法があり、テーブルオプションで、必要な数に自動インクリメントを設定できます。


その直後にmysqlサービス/サーバーを再起動する必要があります。
Cyber

1
その後、サーバーを再起動する必要はないと思います。PhpAdminは、増分開始点を変更するコマンドを実行するだけです。
カリーム2017

再起動する必要はありません。次の挿入から有効になります。
IlludiumPu36

36

私のために働いた最高の解決策:

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で動作し、現在の最大値を知る必要はありません!これにより、自動インクリメントカウンターがリセットされ、存在する最大値から自動的に開始されます。


1
information_schemaにNULL auto-inc値を設定します。チェックSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
私はバージョン5.6.xでテストしましたが、これは完全に機能し、KeremGüneşによるクエリは最大値+ 1を返しました。(最初のクエリの後にnullに設定されている可能性がありますが、2番目のクエリの後には設定されていません)これはInnoDBの最良のソリューションだと思います。
Frank Forte、2016年

明示的な値の設定と同じ:「同じ構造と新しいauto_increment値で新しいテーブルを作成し、元のテーブルからすべてのレコードをコピーして、元のテーブルを削除し、新しいテーブルの名前を変更します。これにより、パフォーマンスに大きな影響(およびディスク容量)が生じる可能性があります。テーブルが大きい場合、本番環境で。」しかし、フルコピーテーブルが2回必要なので、はるかに悪い。
Enyby

これがバージョン5.6.15で機能することを確認しますが、機能しALTER TABLE tablename AUTO_INCREMENT = 1ませ
Nae、

24

この質問に対する最高評価の回答はすべて、「ALTER yourtable AUTO_INCREMENT = value」を推奨しています。ただし、これvalueは、変更が自動インクリメント列の現在の最大値よりも大きい場合にのみ機能します。 MySQL 8のドキュメントによると

カウンタを現在使用中の値以下にリセットすることはできません。InnoDBとMyISAMの両方で、値が現在AUTO_INCREMENT列にある最大値以下の場合、値は現在の最大AUTO_INCREMENT列の値に1を加えた値にリセットされます。

本質的に、OPが質問の2番目の部分で尋ねるように、AUTO_INCREMENTを変更して、autoincrementカラムの値を増やすだけで、1にリセットすることはできません。実際にAUTO_INCREMENTを現在の最大値より下に設定できるオプションについては、「自動インクリメントの主キーの並べ替え/リセット」ご覧ください。


20

MySQL 5.6で機能が変更されたため、更新を追加します。MySQL 5.6以降では、InnoDBで単純なALTER TABLEを使用できます。

ALTER TABLE tablename AUTO_INCREMENT = 1;

ドキュメントはこれを反映するように更新されています:

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

私のテストでは、テーブルがコピーされず、値が変更されるだけであることが示されています。


19

MySQLの自動インクリメント列をリセットする方法には、適切なオプションがあります。

InnoDBではALTER TABLE tablename AUTO_INCREMENT = value;機能しないことに注意してください


8
InnoDBでこれを行う方法を教えてください。
EmptyArsenal 2013

4
MySQL v 5.6.2を使用するとうまく動作します
Eddie B

テーブルからレコードを削除した後、自動インクリメントフィールドがリセットされないという同様の問題がありました。TRUNCATEは機能しているようです。自動インクリメントを削除してから再適用するための以下のソリューションがこれを軽減するのに役立つと思います。
Craig Maloney

@CraigMaloney- DELETE(またはROLLBACK)はIDを回復しません。1つの例外:再起動(またはクラッシュ)した後、次のIDが計算されてMAX(id)+1、削除されたID が最後に効率的に回復されます。例外の例外:MySQL 8.0はこれらのIDを未使用のままにします。
リックジェームズ

12
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を持つことに注意してください!!!。


3
こんなものが欲しい!しかし、追加の警告として。これは明らかにあなたの外部キーを完全に壊します。
NoobishPro 2016

12

次のTRUNCATEような構文テーブルを使用することもできます。 TRUNCATE TABLE table_name

注意してください!! あなたのすべてTRUNCATE TABLE your_table削除しますyour_table!!


14
新しいプログラマーは、指定したテーブルのTRUNCATEすべて削除することに注意してください
Zanshin13

1
上記のコメントは、回答、または少なくとも切り捨ての実際の使用に関する説明に挿入する必要があります。
Lucas Kauz、2015

TRUNCATEauto_incrementフィールドもリセットしますか?私の使用例は、テーブルの古いデータを消去し、新しいデータのIDを1から再び開始することです(テストが完了した後で、適切に使用するためにテーブルを消去するとします)。私はDROPテーブル全体とCREATEそれをもう一度しなければならないと思いました。
ADTC 2016年

はい、TRUNCATEはテーブルのリセットのように機能します。テーブルが作成後に変更されている場合、それは完全に正しくはありません。その後、それらの変更はリセットされません。テーブル構造をエクスポートし、エクスポートを使用して実際のリセットより新しいテーブルを作成するほうが近いと思います。
Chris

はい@ADTC。現在の値を保持するauto_increment場合は、のDELETE FROM代わりにを使用してくださいTRUNCATE
TRiG、

8

空のテーブル用です:

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

使い方は簡単
Abdul Aziz Al Basyir 2017

これはデータで私たちのために働いた。行を次のインデックスにリセットします。ありがとう!
ダズル

urwell @Dazzle!
Abdul Aziz Al Basyir

5

これが私の解決策ですが、列に制約がある場合、または外部キーとして他のテーブルに接続されている場合は、悪影響があるか機能しないため、これを行うことはお勧めしません。

>最初:列をドロップします

ALTER TABLE tbl_name DROP COLUMN column_id

> 2番目:想定する最初の列にしたい場合は、列を再作成して最初に設定します。

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

これはうまくいきます!




1

テーブルを変更してauto_incrementを1に設定しようとしましたが、機能しませんでした。増分していた列名を削除し、その後、優先する名前で新しい列を作成し、その新しい列を最初から増分するように設定することにしました。


どのようにしてそれを実現したのですか?
MZaragoza 2017

@MZaragoza AIのない古い列を削除してから、AIを有効にした新しい列を作成します。
アンドロメダ2017

これを示すために回答を更新できますか?私は本当にそれを
いただければ幸いです

1

テーブルの自動インクリメントカウンターは、次の2つの方法で(再)設定できます。

  1. 他の人がすでに説明したように、クエリを実行することによって:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. ワークベンチまたは他のビジュアルデータベースデザインツールを使用する。Workbenchでそれがどのように行われるかを示しますが、他のツールでもそれほど違いはないはずです。目的のテーブルを右クリックしてAlter table、コンテキストメニューから選択します。下部には、テーブルを変更するために使用可能なすべてのオプションが表示されます。選択するOptionsと、次のフォームが表示されます。 ここに画像の説明を入力してください

    次にAuto increment、図に示すように、フィールドに目的の値を設定します。これは基本的に最初のオプションに示されているクエリを実行します。


0

最新のプラスワンIDを更新するには

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


0

私はググってこの質問を見つけましたが、私が本当に探している答えは2つの基準を満たしています。

  1. 純粋にMySQLクエリを使用する
  2. 既存のテーブルの自動インクリメントをmax(id)+ 1にリセットします

欲しいものがきちんと見つからなかったので、色々な答えの中から答えを出して共有しています。

注意すべきいくつかのこと:

  1. 問題のテーブルはInnoDBです
  2. テーブルは主キーとしてidタイプのフィールドを使用しintます
  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 ;

それを実行します。

実行前は、データベースの[ストアドプロシージャ]を見ると次のようになります。

ここに画像の説明を入力してください

実行するときは、ストアドプロシージャを選択して、[選択の実行]を押すだけです。

ここに画像の説明を入力してください

注:区切り文字の部分は重要です。したがって、この質問で選択した上位の回答からコピーして貼り付けると、この理由で機能しない傾向があります。

実行すると、ストアドプロシージャが表示されます

ここに画像の説明を入力してください

ストアドプロシージャを変更する必要がある場合は、ストアドプロシージャを削除してから、もう一度実行するように選択する必要があります。

手順2:ストアドプロシージャを呼び出す

今回は、単純に通常のMySQLクエリを使用できます。

call reset_autoincrement('products');

もともとはhttps://simkimsia.com/library/sql-queries/#mysql-reset-autoincにある自分のSQLクエリのメモからのもので、StackOverflowに適合しています



-1

このクエリを実行してみてください

 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;

-2

クエリブラウザーに移動して、次の操作を行うことをお勧めします。

  1. schemataに移動し、変更するテーブルを見つけます。
  2. 右クリックして、コピー作成ステートメントを選択します。
  3. 結果タブを開き、作成ステートメントを貼り付けます。
  4. createステートメントの最後の行に移動し、Auto_Increment = Nを探します(Nはauto_incrementフィールドの現在の数値です)。
  5. Nを1に置き換えます。
  6. ctrl+をenter押します。

テーブルに新しい行を入力すると、Auto_incrementが1にリセットされます。

auto_incrementフィールド値がすでに存在する行を追加しようとするとどうなるかわかりません。

この助けを願っています!


-2

最良の方法は、AIを使用してフィールドを削除し、AIを使用して再度追加することです。すべてのテーブルで機能します


1
最善の方法ではありません。列を削除すると、列のデータが失われます
Disha Goyal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.