💭
Supabaseのデータベースのprimary keyをint8からuuidに変更する
データベース設計の見直しに伴い、既存のテーブルのプライマリキーを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