この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:atom
更新日時:2026-10-02 16:08:44

タイトル: AUTO_INCREMENTの追加と確認方法
SEOタイトル: 【MySQL】ALTER TABL 文による AUTO_INCREMENT の追加と確認方法

この記事の要点
  • 既存カラムに付ける: ALTER TABLE t MODIFY id INT UNSIGNED NOT NULL AUTO_INCREMENT;
  • 条件は「整数型」「インデックス(主キーなど)が張られている」「1 テーブルに 1 列だけ」。満たさないと ERROR 1075
  • MODIFY はカラム定義をまるごと置き換えるので、NOT NULL・UNSIGNED・COMMENT など元の定義も書き直す
  • 次の番号を変えるには ALTER TABLE t AUTO_INCREMENT = 1000;
  • 確認は DESC の Extra 列、SHOW CREATE TABLE、information_schema の 3 通り
  • MySQL 8.0 の information_schema.tables の AUTO_INCREMENT 値はキャッシュされていて古いことがある

AUTO_INCREMENT とは

AUTO_INCREMENT は、INSERT 時に値を省略(または NULL を指定)すると、MySQL が自動で連番を振ってくれるカラム属性です。主に主キーの ID に使います。テーブル作成時に付け忘れた場合や、既存テーブルに後から ID 列を追加したい場合に、ALTER TABLE で追加します。

既存カラムに AUTO_INCREMENT を追加する

カラム定義を MODIFY で変更し、AUTO_INCREMENT を付けます。

ALTER TABLE table_name MODIFY column_name INT NOT NULL AUTO_INCREMENT;

INT の部分は、そのカラムの実際のデータ型(BIGINT UNSIGNED など)に合わせて変更してください。旧来の書き方の int(10) の (10) は表示幅で、MySQL 8.0.17 以降は非推奨のため省略して構いません。

追加できる条件

条件満たさない場合
整数型(TINYINT〜BIGINT)であること文字列型には付けられない。FLOAT / DOUBLE への AUTO_INCREMENT は MySQL 8.0.17 以降非推奨
そのカラムにインデックスがあること(主キー、UNIQUE、または複合インデックスの先頭列)ERROR 1075: Incorrect table definition; there can be only one auto column and it must be defined as a key
テーブル内で AUTO_INCREMENT は 1 列だけ同じく ERROR 1075
既存の値に重複が無いこと(主キー・UNIQUE の場合)ERROR 1062: Duplicate entry

必ずしも主キーである必要はありませんが、実務ではほぼ主キーに付けます。主キーが無いテーブルなら、主キーの追加と同時に行います。

ALTER TABLE table_name
  MODIFY id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ADD PRIMARY KEY (id);

ID 列そのものを新しく追加する場合

ID 列が無いテーブルに連番の主キーを追加すると、既存の行にも 1 から順に番号が振られます。

ALTER TABLE table_name
  ADD id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

FIRST を付けると先頭の列として追加されます。既存行への番号の振られ方は行の物理的な順序に依存するため、特定の順番で振りたい場合は別途 UPDATE で調整する必要があります。

次に振られる番号を変更する

ALTER TABLE table_name AUTO_INCREMENT = 1000;

InnoDB では、現在の最大値以下の値を指定しても無視され、「最大値+1」が使われます。テストデータを消した後に 1 から振り直したい場合も、残っている行の最大値より小さくはできません。

AUTO_INCREMENT が貼られているテーブルと値の確認

スキーマ内で AUTO_INCREMENT を持つテーブルと、次に振られる値の一覧を取得します。

SELECT table_name, auto_increment
FROM information_schema.tables
WHERE table_schema = 'スキーマ名'
  AND auto_increment IS NOT NULL;

MySQL 8.0 の注意点: information_schema.tables の統計値はキャッシュされており、既定(information_schema_stats_expiry = 86400 秒)では最大 1 日古い値が表示されることがあります。最新の値を見たいときは、セッションで無効化してから実行します。

SET SESSION information_schema_stats_expiry = 0;

どの列が AUTO_INCREMENT か確認

DESC テーブル名;

Extra 列に auto_increment と表示されている列が対象です。テーブル定義全体と次の値は SHOW CREATE TABLE で確認できます(末尾の AUTO_INCREMENT=数値 が次の値)。

SHOW CREATE TABLE テーブル名\G

-- スキーマ全体から AUTO_INCREMENT 列を探す
SELECT table_name, column_name, column_type
FROM information_schema.columns
WHERE table_schema = 'スキーマ名'
  AND extra LIKE '%auto_increment%';

よくある落とし穴

  • MODIFY で元の属性が消える: MODIFY はカラム定義を丸ごと置き換えます。UNSIGNED、NOT NULL、COMMENT、文字コードなどを書き忘れると、それらが外れます。実行前に SHOW CREATE TABLE で元の定義をコピーしておきましょう
  • 値が 0 の行がある: AUTO_INCREMENT に変更すると、既存の 0 は新しい連番に置き換えられ、重複エラー(ALTER TABLE causes auto_increment resequencing...)になることがあります。先に 0 の行を確認して修正します
  • 大きなテーブルではロックに注意: AUTO_INCREMENT の追加はテーブルの再構築を伴うことがあり、件数が多いと時間がかかり書き込みが止まります。本番ではメンテナンス時間に実行するか、事前に検証環境で所要時間を測ります
  • 番号は欠番が出る: ロールバックや INSERT の失敗、INSERT ... ON DUPLICATE KEY UPDATE などで番号は飛びます。連番に業務上の意味を持たせないようにします
  • 再起動後の挙動の違い: MySQL 5.7 以前は再起動時に「最大値+1」に戻りましたが、MySQL 8.0 以降はカウンターの値が永続化されます

AUTO_INCREMENT を外すには

AUTO_INCREMENT を付けずに MODIFY し直せば外れます。主キーやインデックスはそのまま残ります。

ALTER TABLE table_name MODIFY id INT UNSIGNED NOT NULL;

関連