Added unique constraints on ID fields

X-Lovable-Edit-ID: edt-be272f3d-3fdf-4b50-acc8-684f7bdc71ef
Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot]
2026-04-19 17:58:00 +00:00
co-authored by renee-png
@@ -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 $$;