MySQLテーブルからすべての行を削除し、IDをゼロにリセットします


183

テーブルからすべての行を削除する必要がありますが、新しい行を追加するときに、自動インクリメントを持つ主キーIDを、それぞれ0から1から開始します。

回答:


304

削除せずに、truncateを使用します。

Truncate table XXX

テーブルハンドラーは、最後に使用されたAUTO_INCREMENT値を記憶していませんが、最初からカウントを開始します。これは、通常シーケンス値を再利用しないMyISAMおよびInnoDBにも当てはまります。

ソース


20
Truncateは、制約のないテーブルでもうまく機能しますが、テーブルに外部キー制約がある場合は、Deleteメソッドの使用を検討してください。FK制約がある場合は、この投稿を参照してください。外部キー制約テーブルを切り捨てます
Julian Soro

1
テーブルの切り捨てはロールバックされないことを覚えておいてください
penny chan

83

使用できない場合TRUNCATE(たとえば、外部キーの制約のため)、すべての行を削除した後に変更テーブルを使用して、auto_incrementを再開できます。

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav MyISAMの代わりにテーブルでInnoDBエンジンを使用している可能性があるため、最初のものはインデックスのリセットをサポートしていません。
グスタボルビオ

auto_increment値を変更する前にすべての行を削除する方法
Kasun Siyambalapitiya '31

@KasunSiyambalapitiya DELETE FROM tablename;(しかし、FK制約があるときにはうまく仕事に行くされていません-参照stackoverflow.com/a/5452798/507761を
マシュー・リード

17

テーブルに外部キーがある場合、私は常に次のコードを使用します。

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

ただし、実行時間に違いがあります。ソリンの答えの上を見てください。


2
これは、ワイプするテーブルへの外部キーを持つ任意のテーブルに孤立データを含めるための良い方法です。事実の後で外部キーチェックを有効にしても、MySQLが私の知る限りこれらの外部キーを再検証しません。これにより、参照テーブルに存在しないデータを含む行が残ります。あなたにもさえないかもしれない持っているすべてのあなたのテーブルに外部キーを。
cimmanon 2015

8

興味深い事実。

私はTRUNCATE常により良いパフォーマンスを発揮すると確信していましたが、私の場合、外部キーを含む約30のテーブルがあり、数行しか入力されていないデータベースの場合、TRUNCATEすべてのテーブルで約12秒かかりました。DELETEた。行。自動インクリメントを設定すると、合計で約1秒追加されますが、それでもずっと優れています。

したがって、両方を試してみることをお勧めします。


2

あなたが使いたいならtruncateこれを使ってください:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.