blog.unresolved.xyzblog.unresolved.xyz

PostgreSQLで検証を無効にしてFKを設定する方法

Sun Feb 23 2025

    既存テーブルにFKを追加しようとしたときにDBに負荷がかかるのを避けたいので、検証なしのFKを張る方法をメモします。

    こんな感じで NOT VALID をつけておけばよいです。

    ALTER TABLE "SomeTable" ADD CONSTRAINT "SomeTable_fkey" FOREIGN KEY ("someId") REFERENCES "ToTable"("id") ON DELETE RESTRICT ON UPDATE CASCADE NOT VALID;

    検証がずっと無効だと困るので、別途検証を有効にします。

    ALTER TABLE "SomeTable"  VALIDATE CONSTRAINT "SomeTable_fkey";

    テーブルのON DELETE、ON UPDATEの確認

    select
      connamespace,
      conname,
      c.relname as child_table,
      p.relname as parent_table,
      confdeltype
    from
      pg_constraint
      join pg_class c on c.oid = conrelid
      join pg_class p on p.oid = confrelid;
    -- Foreign key deletion action code: a = no action, r = restrict, c = cascade, n = set null, d = set default

    参考