ダウンタイムゼロの列名変更
新しい列を追加し、二重書き込み、バックフィル、読み取り先の切り替え、古い列の削除を行う、標準的なダウンタイムゼロの名前変更パターンを学びます。
「ダウンタイムゼロの列名変更」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
単純な方法ではうまくいかない
ALTER TABLE t RENAME COLUMN a TO b;はメタデータのみを変更するため高速です。しかし、アプリケーションが列「a」を想定している場合、名前を変更すると「a」を読み取るすべてのクエリが失敗します。
戦略:Expand → Migrate → Contract
ダウンタイムゼロを実現する標準的なパターンは次のとおりです。
- Expand — 古い列を削除せずに新しい列を追加します
- しばらくの間、アプリケーションから両方の列に書き込みます
- Migrate — 過去のデータを新しい列にバックフィルします
- 読み取り対象を新しい列に切り替えます
- Contract — 古い列を削除します
手順:user_name → full_name の名前変更
詳しい手順を見ていきます。
ステップ1 — 新しい列を追加する
オンラインで実行できます(PG 11以降で定数のデフォルト値を使用する場合はメタデータのみが変更されます)。
ALTER TABLE users ADD COLUMN full_name VARCHAR(100);ステップ2 — デュアルライト
両方の列に書き込むコードをデプロイします。
// App writes to both:
UPDATE users SET user_name = $1, full_name = $1 WHERE id = $2;
INSERT INTO users (..., user_name, full_name) VALUES (..., $name, $name);ステップ3 — バックフィル
過去のデータをバッチ単位でコピーします。
UPDATE users SET full_name = user_name
WHERE full_name IS NULL
AND id IN (
SELECT id FROM users WHERE full_name IS NULL LIMIT 10000
);
-- Run in a loop until 0 rows affected.ステップ4 — NOT NULL を追加する(オンライン)
バックフィルが完了したら、安全にNOT NULLを適用します。
ALTER TABLE users
ADD CONSTRAINT fn_not_null CHECK (full_name IS NOT NULL) NOT VALID;
ALTER TABLE users VALIDATE CONSTRAINT fn_not_null;
ALTER TABLE users ALTER COLUMN full_name SET NOT NULL;
ALTER TABLE users DROP CONSTRAINT fn_not_null;ステップ5 — 読み取りを切り替える
user_nameではなくfull_nameを読み取るコードをデプロイします。
ステップ6 — デュアルライトを停止する
full_nameのみに書き込むコードをデプロイします。
ステップ7 — 古い列を削除する
オンラインで実行できます(メタデータのみが変更されます)。
ALTER TABLE users DROP COLUMN user_name;トレードオフ:時間と複雑さ
単純な名前変更が、数日から数週間にわたる4〜7回のデプロイになります。複雑な本番システムでは、これが唯一の安全な方法です。
テーブルの名前変更
同様のパターンですが、より困難です。一時的なエイリアスとしてVIEWを使用します。
ALTER TABLE old_name RENAME TO new_name;
CREATE VIEW old_name AS SELECT * FROM new_name;
-- Deploy new code. Then drop the view.まとめ
ダウンタイムゼロで列の名前を変更するには、expand → migrate → contractの手順に従います。
- 新しい列を追加する
- デュアルライトする
- バッチ単位でバックフィルする
- 読み取りを切り替える
- 古い列への書き込みを停止する
- 古い列を削除する
クイックチェック
古い列と新しい列の両方へのデュアルライトをデプロイした直後に行うフェーズはどれでしょうか。
よくある質問
「ダウンタイムゼロの列名変更」レッスンは無料ですか?
はい。「ダウンタイムゼロの列名変更」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「ダウンタイムゼロの列名変更」で何を学びますか?
新しい列を追加し、二重書き込み、バックフィル、読み取り先の切り替え、古い列の削除を行う、標準的なダウンタイムゼロの名前変更パターンを学びます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ダウンタイムゼロの列名変更」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- オンラインマイグレーション:ALTER TABLEがロックする理由
- 並行インデックス作成(CREATE INDEX CONCURRENTLY)
- ダウンタイムゼロの列名変更
- ツール:Flyway、Liquibase、Sqitch