データベースを運用していると、後から新しい項目を追加したくなることがよくあります。この記事では、MySQLでテーブルに列(カラム)を追加する方法を、初心者の方にもわかりやすく丁寧に解説します。
MySQLで列を追加する基本コマンド
MySQLでテーブルに新しい列を追加するには、ALTER TABLE文を使用します。基本的な構文は以下の通りです。
ALTER TABLE テーブル名 ADD COLUMN 列名 データ型;
実際の使用例
例えば、usersというテーブルにメールアドレスを保存するemail列を追加する場合は、次のように書きます。
ALTER TABLE users ADD COLUMN email VARCHAR(255);
これだけで、usersテーブルに新しいemail列が追加されます。とてもシンプルですね。
制約を付けて列を追加する方法
実務では、単に列を追加するだけでなく、データの整合性を保つために制約を設定することが一般的です。
NOT NULL制約を付ける
空の値を許可したくない場合は、NOT NULL制約を付けます。
ALTER TABLE users ADD COLUMN age INT NOT NULL;
ただし、既にデータが入っているテーブルにNOT NULLの列を追加する場合は注意が必要です。デフォルト値を指定しないとエラーになることがあります。
デフォルト値を設定する
列を追加する際に、デフォルトで入る値を設定できます。
ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active';
この例では、新しく作成されるレコードには自動的にstatusに'active'という値が入ります。
NOT NULLとデフォルト値を両方設定する
最も安全な方法は、NOT NULL制約とデフォルト値を両方設定することです。
ALTER TABLE users ADD COLUMN created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
CURRENT_TIMESTAMPを使うと、レコードが作成された日時が自動的に記録されます。作成日時や更新日時を管理する列でよく使われるテクニックです。
列を追加する位置を指定する
MySQLでは、新しい列をどこに配置するかを指定できます。
テーブルの最初に追加する
ALTER TABLE users ADD COLUMN id INT FIRST;
FIRSTキーワードを使うと、テーブルの一番最初の列として追加されます。
特定の列の後ろに追加する
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
AFTERキーワードを使うと、指定した列の直後に新しい列が追加されます。この例では、email列の後ろにphone列が追加されます。
列の順序は見た目の問題だけで、データベースのパフォーマンスには影響しません。しかし、テーブル構造を見やすく整理するために便利な機能です。
複数の列を一度に追加する
複数の列を追加したい場合は、カンマで区切って一度に実行できます。
ALTER TABLE users
ADD COLUMN email VARCHAR(255),
ADD COLUMN phone VARCHAR(20),
ADD COLUMN address TEXT;
一つずつ実行するよりも効率的で、テーブルのロック時間も短縮できます。
よくある使用例
実務でよく使われるパターンをいくつか紹介します。
メールアドレス列の追加
ALTER TABLE users ADD COLUMN email VARCHAR(255) UNIQUE;
UNIQUE制約を付けることで、同じメールアドレスの重複登録を防げます。
ステータス管理列の追加
ALTER TABLE orders ADD COLUMN status ENUM('pending', 'processing', 'completed', 'cancelled') DEFAULT 'pending';
ENUM型を使うと、指定した値だけを許可できます。ステータス管理に便利です。
タイムスタンプ列の追加
ALTER TABLE products
ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
作成日時と更新日時を自動管理する列です。ON UPDATE CURRENT_TIMESTAMPを付けると、レコード更新時に自動的に日時が更新されます。
外部キー列の追加
ALTER TABLE orders ADD COLUMN user_id INT;
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
他のテーブルと関連付けるための外部キー列を追加する場合の例です。
COLUMNキーワードは省略できる
実はCOLUMNキーワードは省略可能です。以下の2つは同じ意味になります。
ALTER TABLE users ADD COLUMN email VARCHAR(255);
ALTER TABLE users ADD email VARCHAR(255);
どちらを使っても問題ありませんが、COLUMNを付けた方が読みやすいと感じる人が多いようです。
注意点とベストプラクティス
既存データがある場合の注意点
テーブルに既にデータが入っている状態でNOT NULL列を追加する場合は、必ずデフォルト値を設定しましょう。そうしないと、既存のレコードに値が入らずエラーになる可能性があります。
-- 推奨される方法
ALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active';
-- 既存データがある場合、これはエラーになる可能性がある
ALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL;
大規模テーブルでの実行
データ量が多いテーブルの場合、列の追加には時間がかかることがあります。本番環境で実行する際は以下の点に注意してください。
- メンテナンス時間帯に実行する
- 事前にテスト環境で実行時間を確認する
- 可能であれば、サービスへの影響が少ない時間帯を選ぶ
バックアップを取る
テーブル構造を変更する前には、必ずバックアップを取りましょう。万が一問題が発生しても、すぐに元に戻せます。
-- テーブルのバックアップ例
CREATE TABLE users_backup AS SELECT * FROM users;
追加した列を確認する方法
列が正しく追加されたかを確認するには、以下のコマンドを使います。
DESCRIBE users;
または
SHOW COLUMNS FROM users;
これでテーブルの全ての列情報が表示され、新しく追加した列が含まれているか確認できます。
列の追加に失敗した場合のトラブルシューティング
エラー: Column already exists
同じ名前の列が既に存在する場合に出るエラーです。列名を変えるか、既存の列を変更したい場合はALTER TABLE ... MODIFYを使います。
エラー: Data too long for column
既存データがあるテーブルに、サイズの小さい列を追加しようとした場合に発生します。データ型のサイズを適切に設定しましょう。
テーブルがロックされている
他のプロセスがテーブルを使用中の場合、ALTER TABLEが待機状態になることがあります。この場合は、他の処理が終わるまで待つか、メンテナンス時間に実行するようにしましょう。
まとめ
MySQLでテーブルに列を追加する方法について解説しました。基本的な追加方法から、制約の設定、位置の指定まで、様々なパターンを紹介しました。
重要なポイントをまとめると以下の通りです。
- 基本は
ALTER TABLE テーブル名 ADD COLUMN 列名 データ型 - 制約(NOT NULL、DEFAULT、UNIQUEなど)を適切に設定する
- 既存データがある場合はデフォルト値の設定を忘れずに
- 大規模テーブルでは実行時間に注意する
- 変更前には必ずバックアップを取る
データベースの運用では、後から列を追加することは非常によくあります。この記事で紹介した方法を使って、安全にテーブル構造を変更できるようになりましょう。
何か困ったことがあれば、まずは小さなテスト用テーブルで試してみることをおすすめします。実際に手を動かして練習することで、より理解が深まります。