【SQL実践|実務向け】現場で迷わない!ALTER TABLEによるテーブル構造変更のベストプラクティス

1. 導入

データベース設計は完璧を目指しても、要件変更により後からカラムの追加や削除が必要になることは避けられません。phpMyAdminのようなGUIツールは直感的で便利ですが、本番環境での作業ミスを防ぐためには、裏側で実行されている「ALTER TABLE文」を理解し、SQLコードとして管理することが重要です。本稿では、安全かつ効率的なスキーマ変更の手法を解説します。

2. 基礎知識

ALTER TABLEとは、作成済みのテーブル定義を変更するためのSQLコマンドです。
ADD: 新しいカラムを追加する。
MODIFY/CHANGE: 既存カラムのデータ型や制約(NOT NULLなど)を変更する。
DROP: 不要になったカラムを削除する。
これらの操作は、テーブルのサイズが大きい場合、実行中にテーブルがロックされ、アプリケーションの停止(ダウンタイム)を招くリスクがあります。そのため、現場では「いつ、どのように実行するか」という計画が不可欠です。

3. 実装/解決策

実務では、GUIでポチポチと作業するのではなく、DDL(Data Definition Language)ファイルとしてSQLを保存し、バージョン管理ツール(Git等)で履歴を残すのが定石です。また、カラムを追加する際は「AFTER カラム名」を指定することで、論理的に関連するカラムの隣に配置し、可読性を保つ工夫をしましょう。

4. サンプルプログラム

以下は、ユーザーテーブル(users)に対して実務でよく発生する変更操作のSQL例です。

— 1. カラムの追加 (emailカラムをnameカラムの後ろに追加)
ALTER TABLE users ADD COLUMN email VARCHAR(255) AFTER name;

— 2. カラムの定義変更 (型を変更し、デフォルト値を設定)
— CHANGEを使うとカラム名の変更と型の変更を同時に行えます
ALTER TABLE users CHANGE COLUMN age age_years INT DEFAULT 0;

— 3. カラムの削除 (不要になった電話番号カラムを削除)
ALTER TABLE users DROP COLUMN phone_number;

— 4. 実行時の注意点:
— 大規模テーブルの場合は、ALGORITHM=INPLACE, LOCK=NONE を付与することで
— テーブルロックを回避しつつオンラインで変更可能な場合があります。
ALTER TABLE users ADD COLUMN last_login DATETIME, ALGORITHM=INPLACE, LOCK=NONE;

5. 応用・注意点

現場で最も陥りやすいバグは「依存関係の破壊」です。
既存のアプリケーションコード: カラムを削除すると、そのカラムを参照しているPHPやJavaのプログラムがエラーを起こします。必ずソースコード側の修正を先に行うか、段階的に削除してください。
デフォルト値の罠: NOT NULL制約を追加する際、既存データに値が入っていないとエラーになります。事前にデフォルト値を設定するか、UPDATE文で既存データの値を埋めてから変更を実行してください。
バックアップ: どのような小さな変更でも、実行前には必ずバックアップを取得してください。オンライン実行が不安な場合は、ステージング環境で同一データ量を用いた検証を行うことが、DBAとしての責任ある対応です。

コメント

タイトルとURLをコピーしました