Atlasマイグレーションで既存インデックスを制約に変換する方法
PostgreSQL
Atlas
知識
AtlasがUNIQUE INDEXをUNIQUE CONSTRAINTに変換する際、ADD CONSTRAINT ... UNIQUE USING INDEX ...構文を生成する。
この構文は既存インデックスを制約に変換するもので、インデックスが存在しないとエラーになる。
環境によってインデックスの有無が異なる場合、PL/pgSQLで条件分岐する:
sql
DO $$
BEGIN
-- インデックスがあれば制約に変換
IF EXISTS (SELECT 1 FROM pg_indexes WHERE indexname = 'index_name') THEN
ALTER TABLE "table" ADD CONSTRAINT "constraint_name" UNIQUE USING INDEX "index_name";
-- 制約もなければ新規作成
ELSIF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'constraint_name') THEN
ALTER TABLE "table" ADD CONSTRAINT "constraint_name" UNIQUE ("column1", "column2");
END IF;
END $$;