rss/migrations/002_unique_index_url_norm.sql

38 lines
1.2 KiB
SQL

-- Añadir columna generada url_norm y crear índice único sobre ella.
-- OJO: si ya existen duplicados, este índice fallará.
-- Primero crea la columna si no existe:
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name='feeds' AND column_name='url_norm'
) THEN
ALTER TABLE feeds
ADD COLUMN url_norm text GENERATED ALWAYS AS (normalize_url(url)) STORED;
END IF;
END $$;
-- Índice único (concurrently para no bloquear). Requiere estar fuera de transacción.
-- Si tu herramienta corre todo en una transacción, ejecuta estas dos líneas aparte.
-- Quita duplicados antes si da error.
CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS feeds_url_norm_uniq ON feeds (url_norm)
WHERE url_norm IS NOT NULL;
-- (Opcional) repetir lo mismo para fuentes_url y noticias si quieres esa garantía también:
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name='fuentes_url' AND column_name='url_norm'
) THEN
ALTER TABLE fuentes_url
ADD COLUMN url_norm text GENERATED ALWAYS AS (normalize_url(url)) STORED;
END IF;
END $$;
CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS fuentes_url_norm_uniq ON fuentes_url (url_norm)
WHERE url_norm IS NOT NULL;