PostgreSQLのテーブル途中にカラムを追加するのがなぜ難しいのか
PostgreSQLではテーブルの途中にカラムを追加することが非常に難しい。その理由は、PostgreSQLの行は不変であり、新しいカラムを追加する際には実質的にテーブル全体の書き換えが必要になるからだ。また、テーブル定義におけるカラムの物理的な順序は内部的に重要な意味を持ち、単なるメタデータの変更だけでは済まない。この記事ではその技術的課題と代替手段について解説する。
背景メモ
- PostgreSQLは、行をディスク上の固定長ページに格納する「ヒープ」構造を採用しており、テーブルのスキーマは各行の先頭に格納された「マップ」で管理される。このため、カラムを途中に追加するには全行のデータを再書き込みする必要が生じ、本質的にコストが高い。
- ALTER TABLE...ADD COLUMNはPostgreSQL 11以降、デフォルト値がNULLまたは不変式(immutable expression)の場合にメタデータのみの高速な変更が可能だが、カラム位置は常に末尾に追加される仕様。既存の行を物理的に書き換えずに済む代わりに、途中挿入はできない。
- 開発者が「途中にカラムを追加したい」と感じるのは、マイグレーションファイルやORMのモデル定義でカラム順序を意識するためだが、SQLのSELECT *順序以外に実質的な影響はなく、運用上の正当な理由はほぼない。
- 同記事の著者はBytebaseというデータベース管理ツールの開発元。同社はスキーマ変更の安全な実行方法として、カラムを末尾に追加し続けるベストプラクティスを推奨している。