1. 導入:なぜALTER TABLEの理解が重要なのか
データベース運用において、要件変更に伴うテーブル定義の変更は避けられません。しかし、本番環境で安易に ALTER TABLE を実行すると、テーブルのロックによるサービス停止や、意図しないデータ破損を招くリスクがあります。本記事では、日常的な運用で頻出する変更操作を整理し、現場で安全に作業するためのポイントを解説します。
2. 基礎知識:ALTER TABLEとは
ALTER TABLE は、既存のテーブル構造(列、制約、名称など)を変更するためのSQLコマンドです。
テーブル作成(CREATE TABLE)が「箱を作る」作業なら、ALTER TABLEは「稼働中の箱を壊さずに改造する」作業です。PostgreSQLでは多くの変更が即座に反映されますが、データ量が多いテーブルに対して実行する場合、処理時間やロックの長さに注意を払う必要があります。
3. 実装/解決策:現場でよく使う操作例
実務では、単なるカラム追加だけでなく、制約の管理やデータ型の変更が求められます。特にデータ型を変更する際は、既存データとの互換性に注意が必要です。
4. サンプルプログラム:実務で使えるALTER TABLE構文
以下は、業務で頻出する主要な操作をまとめたSQLスクリプトです。適宜、環境に合わせて実行してください。
— 1. カラムの追加(デフォルト値付き)
— ※PostgreSQL 11以降は、デフォルト値付きの追加も高速に処理されます
ALTER TABLE employees ADD COLUMN status VARCHAR(20) DEFAULT ‘active’;
— 2. カラム名の変更
ALTER TABLE employees RENAME COLUMN old_name TO display_name;
— 3. データ型の変更(キャストが必要な場合)
— USING句を使用して、文字列から数値へ明示的に変換します
ALTER TABLE employees ALTER COLUMN age TYPE INTEGER USING age::INTEGER;
— 4. 制約の追加(NOT NULL)
ALTER TABLE employees ALTER COLUMN email SET NOT NULL;
— 5. 外部キーや制約の削除
— CASCADEを付けると、依存関係にあるオブジェクト(ビュー等)も併せて削除されます
ALTER TABLE employees DROP CONSTRAINT fk_department_id CASCADE;
5. 応用・注意点:現場で陥りやすい罠と対策
・ロック競合に注意
ALTER TABLEの多くは、テーブル全体に対する「ACCESS EXCLUSIVE」ロックを取得します。つまり、変更中は対象テーブルへの読み書きがブロックされます。数百万件を超える大規模テーブルの場合、数秒で終わる操作でも、実行待ちのクエリが溜まり、結果としてDB全体が応答不能になることがあります。
対策: 実行前に「LOCK_TIMEOUT」を設定し、長時間待機が発生しないようにしてください。
・DEFAULT値の付与
古いPostgreSQLのバージョンでは、デフォルト値付きでカラムを追加するとテーブル全体を書き換えるため非常に時間がかかりました。最新のバージョンでは高速化されていますが、念のため実行計画や検証環境でのパフォーマンス測定を強く推奨します。
・USING句の活用
データ型を変更する際、単純に「TYPE」を指定するだけでは変換エラーになることがあります。前述のサンプルにあるように、`USING column::type` で変換ロジックを明示することで、安全にデータ移行を行うことが可能です。
・バックアップの徹底
DDL操作はロールバックが難しいため、作業前には必ずバックアップを取得するか、トランザクション内(BEGIN; … COMMIT;)で実行し、問題がないことを確認してから確定するようにしましょう。

コメント