57 lines
2.2 KiB
SQL
57 lines
2.2 KiB
SQL
-- Migration: Enforce unique economic customer number on customers
|
|
-- Prevents ambiguous mapping during e-conomic sync
|
|
|
|
-- Normalize values before uniqueness check (only for text-like columns)
|
|
-- Uses string-concatenated EXECUTE to avoid nested dollar-quoting issues
|
|
DO $$
|
|
DECLARE
|
|
column_data_type TEXT;
|
|
BEGIN
|
|
SELECT data_type
|
|
INTO column_data_type
|
|
FROM information_schema.columns
|
|
WHERE table_schema = 'public'
|
|
AND table_name = 'customers'
|
|
AND column_name = 'economic_customer_number';
|
|
|
|
-- Only normalize whitespace for text-type columns (integer columns are skipped)
|
|
IF column_data_type IN ('character varying', 'character', 'text') THEN
|
|
EXECUTE 'UPDATE customers'
|
|
|| ' SET economic_customer_number = NULL'
|
|
|| ' WHERE economic_customer_number IS NOT NULL'
|
|
|| ' AND btrim(economic_customer_number) = ''''';
|
|
|
|
EXECUTE 'UPDATE customers'
|
|
|| ' SET economic_customer_number = btrim(economic_customer_number)'
|
|
|| ' WHERE economic_customer_number IS NOT NULL';
|
|
END IF;
|
|
END $$;
|
|
|
|
-- Abort migration if duplicates exist (must be manually resolved first)
|
|
DO $$
|
|
DECLARE
|
|
duplicate_value TEXT;
|
|
duplicate_count INTEGER;
|
|
BEGIN
|
|
SELECT economic_customer_number, COUNT(*)::INTEGER
|
|
INTO duplicate_value, duplicate_count
|
|
FROM customers
|
|
WHERE economic_customer_number IS NOT NULL
|
|
GROUP BY economic_customer_number
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY COUNT(*) DESC, economic_customer_number
|
|
LIMIT 1;
|
|
|
|
IF duplicate_value IS NOT NULL THEN
|
|
RAISE EXCEPTION 'Cannot create unique index on customers.economic_customer_number. Duplicate value: % (count=%). Resolve duplicates and rerun migration.', duplicate_value, duplicate_count;
|
|
END IF;
|
|
END $$;
|
|
|
|
-- Enforce uniqueness for non-null values
|
|
CREATE UNIQUE INDEX IF NOT EXISTS customers_economic_customer_number_unique_idx
|
|
ON customers (economic_customer_number)
|
|
WHERE economic_customer_number IS NOT NULL;
|
|
|
|
COMMENT ON INDEX customers_economic_customer_number_unique_idx IS
|
|
'Ensures e-conomic customer numbers are unique to prevent sync mismatch.';
|