テーブルにレコードのDELETEとINSERTを繰り返していると auto_incrementの連番に歯抜けが発生します。運用上問題なければそのままで良いですが、その歯抜けをリセットしたくなることがあります。

例えば、全てのレコードを削除して連番を振り直すのであればTRUNCATE TABLE 文を使用する事ができます。しかし、例えば、1-8番までは既に使用していて新しく追加するレコードに9番を振りたいのだけれど、9番は過去に削除したことがあり、振ることができないような場合、次のALTER 文が使えます。

auto_incrementの連番をリセット する書式

ALTER TABLE tablename auto_increment = 1;

以下の例ではcarsテーブルに対してauto_incrementの連番をリセットしています。

ALTER TABLE cars auto_increment = 1;

ただし、途中で抜けた連番を埋められるわけではありません。抜けた連番を埋めるには、埋めたい番号を指定してINSERT文を発行する必要があります。

さらに、連番のリセットは稼働中のシステムで行うことはおすすめしません。なぜなら、既に削除されたIDを再利用することにより、意図しないデータの衝突や誤解を引き起こす可能性があるからです。

参考までにJavaからMySQLのauto_incrementの連番をリセットするコードを掲載します。

package model.dao;

import java.sql.PreparedStatement;
import java.sql.SQLException;

public class AutoIncrement extends SuperDao {

	private PreparedStatement ps;

	public void ResetAutoIncrement(String tableName) {

		this.connect();

		String SQL = "ALTER TABLE " + tableName + " AUTO_INCREMENT = 1";

		try {
			ps = con.prepareStatement(SQL);

			ps.executeUpdate();

		} catch (SQLException e) {
			System.err.println(e);
		} finally {
			this.close();
		}
		System.out.println(tableName + "のauto_incrementの連番をリセットしました。");
	}

	public static void main(String[] args) {
		AutoIncrement autoIncrement = new AutoIncrement();
		autoIncrement.ResetAutoIncrement("cars");
	}
}

最後までお読みいただきありがとうございます。