PostgreSQL ガイドとチュートリアル
ここにあるのは Postgres そのものについてのガイドです。どの記事も本番環境で実際に起こる問題から始まり、psql にそのまま貼り付けられる SQL で再現し、確認できる対処法で終わります。対象は Relyt One が動かしている PostgreSQL 17 で、内容の多くは最近の Postgres 全般にも当てはまります。下の読む順番に沿って読み進めても、目の前の問題に合うガイドから読んでもかまいません。
11 件の記事
まずはここから
おすすめの順番で 4 本のガイドを並べています。テーブルをロックせずにスキーマを変更する方法、クエリにインデックスを使わせる方法、行レベルセキュリティの抜け穴をふさぐ方法、そして Postgres 18 から移るときに変わる点です。
- PostgreSQL の ALTER TABLE でテーブルがロックされる理由:マイグレーションごとのロックと安全な実行方法1 行の ALTER TABLE でテーブルへのクエリがすべて止まるのはなぜか。PostgreSQL 17 でよく使うマイグレーションがそれぞれどのロックを取り、どれがテーブルを書き換えるのかを示し、本番を止めないための lock_timeout、NOT VALID、CONCURRENTLY のパターンを解説します。
- PostgreSQL でインデックスが使われない 7 つの原因と対処法(EXPLAIN の出力つき)インデックスを作成したのに EXPLAIN が Seq Scan のまま。PostgreSQL がインデックスを使わない 7 つの原因(関数、型キャスト、ワイルドカード、選択性、古い統計情報、カラム順、小さなテーブル)を、再現手順と対処法つきで解説します。
- 行レベルセキュリティが「開いたまま」になる 5 つのケース行レベルセキュリティは、WHERE 句の書き忘れに対する最良の防御ですが、気づかないうちに適用されなくなることがあります。PostgreSQL 17 で RLS が開いたままになる 5 つのケースを、再現手順、対処法、CI で検出するカタログクエリとともに紹介します。
- Postgres 18 から来た方へ:Postgres 17 で変えるべきことRelyt One は PostgreSQL 17 で動いています。スキーマや習慣が Postgres 18 由来の場合に、17 で失敗するもの、代わりに書くべきもの、18 で取得したダンプを読み込む方法を紹介します。すべてのスニペットは両方のバージョンで実行しました。
Postgres タグのその他の記事
RSS フィード
Postgres の ID が番号を飛ばす理由と、インポート後の「duplicate key」エラーの直し方
PostgreSQL の serial 列と ID 列(identity)で番号の欠番が生じる原因(ロールバック、ON CONFLICT、クラッシュ、CACHE)、データのインポート直後に duplicate key value violates unique constraint で挿入が失敗する理由、すべてのシーケンスをまとめてリセットする 1 つのクエリ、integer の ID が尽きたとき、そして欠番のない請求書番号を扱います。すべてのステートメントを Postgres 17.11 で再現しています。

Postgres をジョブキューにする:FOR UPDATE SKIP LOCKED の正しい使い方
PostgreSQL 17 で SELECT ... FOR UPDATE SKIP LOCKED を使ってバックグラウンドジョブのキューを作る方法を説明します。素朴な SELECT してから UPDATE する方法で同じジョブが 2 回取得される理由、FOR UPDATE だけではワーカーが待たされる理由、リースとリトライ、LISTEN/NOTIFY、VACUUM、そしてポーリングするワーカーがサーバーレスのコンピュートに与える影響を扱います。すべてのステートメントを Postgres 17.11 で再現しています。

Postgres の INSERT ... ON CONFLICT と MERGE:どちらで upsert すべきか、それぞれが出すエラー
PostgreSQL 17 で INSERT ... ON CONFLICT と MERGE をどう使い分けるか、MERGE が並行実行時に重複キーエラーで失敗する理由、そして「cannot affect row a second time」、空の RETURNING、「no unique or exclusion constraint matching the ON CONFLICT specification」の直し方を説明します。すべてのステートメントを Postgres 17.11 で再現しています。

PgBouncer のトランザクションプーリングで壊れるものと、それぞれの直し方
トランザクションプーラーの背後で「prepared statement already exists」が出る理由、設定がリクエスト間で漏れる理由、アドバイザリロックが何もロックしない理由を PgBouncer 1.24 と PostgreSQL 17 で再現し、それぞれの修正方法と、代わりにダイレクト接続を使うべき場面の判断基準を示します。

Relyt One マネージド認証 入門
Relyt One 上でマルチユーザーの Next.js アプリを作るステップバイステップのガイドです。ブランチでマネージド認証を有効にし、ユーザーをサインインさせ、@relyt/auth で JWT を検証し、Postgres の行レベルセキュリティで各ユーザーの行を分離します。

Relyt One のマネージド認証、プレビュー版を公開
アプリのユーザー向けのサインアップ、サインイン、セッション、組織を、ブランチのすぐ隣で動かし、ユーザーはあなた自身のデータベースに保存します。トークンは JWKS で検証する短命な EdDSA JWT で、残りは行レベルセキュリティが引き受けます。

Relyt One のご紹介:コードのようにブランチできるサーバーレス Postgres
Relyt One は、コピーオンライトのブランチ、アイドル時に一時停止するコンピュート、組み込みのベクトル検索、マネージド認証を備えたサーバーレス PostgreSQL 17 です。その仕組みと、サインインからブランチ済みのデータベースまでを 5 分でたどる方法を紹介します。
英語版のみの記事もあります。 英語の記事