diff --git a/migrations/1781000000006_reconcile-user-cards-unique.js b/migrations/1781000000006_reconcile-user-cards-unique.js index 2a2dba7..aa5f98c 100644 --- a/migrations/1781000000006_reconcile-user-cards-unique.js +++ b/migrations/1781000000006_reconcile-user-cards-unique.js @@ -64,17 +64,25 @@ export const up = (pgm) => { // Re-assert the canonical 3-col UNIQUE from `initial-schema.js`. // No-op against initial-schema-applied envs (the constraint already // exists under its auto-generated name); constructive against any - // env where the constraint was somehow dropped. Wrapped in - // `DO $$ ... EXCEPTION WHEN duplicate_object` because Postgres - // does not support `ADD CONSTRAINT ... IF NOT EXISTS`. + // env where the constraint was somehow dropped. Postgres does not + // support `ADD CONSTRAINT ... IF NOT EXISTS`, so we pre-check + // `pg_constraint`. (An earlier draft used `EXCEPTION WHEN + // duplicate_object`, but `ADD CONSTRAINT UNIQUE` raises + // SQLSTATE 42P07 `duplicate_table` from the auto-created + // supporting index, not 42710 `duplicate_object` — the pre-check + // sidesteps both.) pgm.sql(` DO $$ BEGIN - ALTER TABLE user_cards - ADD CONSTRAINT user_cards_user_id_card_id_is_foil_key - UNIQUE (user_id, card_id, is_foil); - EXCEPTION - WHEN duplicate_object THEN NULL; + IF NOT EXISTS ( + SELECT 1 FROM pg_constraint + WHERE conname = 'user_cards_user_id_card_id_is_foil_key' + AND conrelid = 'user_cards'::regclass + ) THEN + ALTER TABLE user_cards + ADD CONSTRAINT user_cards_user_id_card_id_is_foil_key + UNIQUE (user_id, card_id, is_foil); + END IF; END $$; `); };