💭

Supabaseのデータベースのprimary keyをint8からuuidに変更する

2024/02/21に公開

データベース設計の見直しに伴い、既存のテーブルのプライマリキーをid(int8)からid(uuid)に変更するケースがあった。

環境

  • Supabase
  • Postgres 15.1.0.116

注意事項

すでにDBに登録されているデータの移行は今回含まれていないため、db resetをする前提での内容になっています。

Supabase STUDIOでの操作

Supabase STUDIOのedit columnsからidカラムの型をint8からuuidに変更することはできない。型のキャストができないよと怒られる。

そのため、一度idカラムを削除し、新たにuuid型でカラムを追加しなければならない。

STUDIOでカラムの修正が完了したら、supabase db diffコマンドでmigrationファイルを出力するのが通常の手順だが、出力されたmigrationファイルではmigration実行時にエラーが出る。

出力されたmigrationファイル

次のようなmigrationファイルができるが、これだと実行時にエラーが出る。

alter table "public"."table_name" alter column "id" drop identity;

alter table "public"."table_name" alter column "id" set data type uuid using "id"::uuid;
ERROR: cannot cast type bigint to uuid (SQLSTATE 42846)

migrationファイルを書き換える

もともとのmigrationファイルだと、idカラムに対しては、そのカラムが自動インクリメントするように設定されたIDENTITY属性の削除クエリしか書かれておらず、その状態で型キャストのクエリが実行されるため、エラーになっている。

なので、まずはidカラムを削除し、新たにプライマリキーとしてuuid型のidカラムを追加するクエリを書く。

alter table "public"."route_target_people" drop column "id";

alter table "public"."route_target_people" add column "id" uuid not null default uuid_generate_v4(), add primary key ("id");

Discussion