タイトル: AUTO_INCREMENTの追加と確認方法
SEOタイトル: 【MySQL】ALTER TABL 文による 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;