こんにちは! デジスマチームの山田です。これはデジスマチームのブログリレー3日目の投稿です。

本番稼動中のデータベースの運用において、NOT NULL制約を持たせたいカラムを既存のテーブルに追加する作業は頭を悩ませるものです。PostgreSQL 11(以下、PG11)以降、DEFAULTを固定の値で指定した場合のカラム追加は高速化されました。しかしDEFAULTとして固定値を用意するのではなく、各行ごとに異なる値の非NULLなカラムを追加したいというケースもあります。このような場合「一度NULLを許可してカラムを追加し、アプリケーションの改修やUPDATEによるバックフィルを完了させた後にNOT NULL制約を追加する」という手順を踏むことがあります。この際テーブルが長時間ロックされることを避けるためにCHECK制約を介した少し複雑な手順が必要でした。
そんな中PostgreSQL 18のリリースノートを読んでいると、次の一文が目に留まりました。
Allow ALTER TABLE to set the
NOT VALIDattribute ofNOT NULLconstraints
ついにNOT NULL制約を追加する際のNOT VALIDがサポートされたようです。この記述から、これまでのCHECK制約を経由する手順が不要になり、運用がよりスマートになるのではないかと期待をしました。
本稿ではこの改善が既存の運用手順をどう簡素化するのか、実際に検証した内容をお届けします。
- サマリ
- 検証した環境
- 検証:PG17
- 1. NULLを許可してカラムを追加
- 2. 追加したカラムのバックフィル
- 3. 非NULLを検証するCHECK制約をNOT VALIDで追加
- 4. VALIDATE CONSTRAINT
- 5. SET NOT NULL
- 6. CHECK制約の削除
- 検証:PG18
- 1. NULLを許可してカラムを追加
- 2. 追加したカラムのバックフィル
- 3. NOT NULL制約をNOT VALIDで追加
- 4. VALIDATE CONSTRAINT
- 手順の比較
- この機能が実現するまで
- 終わりに
- We are Hiring!
- エンジニア採用ページはこちら
- カジュアル面談もお気軽にどうぞ
- エンジニア新卒採用サイト!




