diff --git a/supabase/migrations/20260419175749_a359e1ae-edf9-4934-935f-d3c09c4b69d2.sql b/supabase/migrations/20260419175749_a359e1ae-edf9-4934-935f-d3c09c4b69d2.sql new file mode 100644 index 0000000..e36b585 --- /dev/null +++ b/supabase/migrations/20260419175749_a359e1ae-edf9-4934-935f-d3c09c4b69d2.sql @@ -0,0 +1,37 @@ + +-- Replace partial unique indexes on external_id with full unique constraints +-- so PostgREST .upsert(onConflict: 'external_id') can match them. +-- Postgres allows multiple NULLs in a UNIQUE constraint, so partial index is unnecessary. + +DO $$ +DECLARE + t text; + tables text[] := ARRAY[ + 'cases','clients','contacts','homeowners','tasks','events','call_logs', + 'expenses','invoices','time_entries','status_updates','documents' + ]; +BEGIN + FOREACH t IN ARRAY tables LOOP + -- Drop the old partial unique index if present + EXECUTE format('DROP INDEX IF EXISTS public.%I', t || '_external_id_uidx'); + -- Drop legacy duplicate if present + EXECUTE format('DROP INDEX IF EXISTS public.%I', t || '_external_id_key'); + + -- Add a real UNIQUE constraint (only if not already present) + IF NOT EXISTS ( + SELECT 1 + FROM pg_constraint c + JOIN pg_class r ON r.oid = c.conrelid + JOIN pg_namespace n ON n.oid = r.relnamespace + WHERE n.nspname = 'public' + AND r.relname = t + AND c.contype = 'u' + AND c.conname = t || '_external_id_unique' + ) THEN + EXECUTE format( + 'ALTER TABLE public.%I ADD CONSTRAINT %I UNIQUE (external_id)', + t, t || '_external_id_unique' + ); + END IF; + END LOOP; +END $$;