sql >> Database >  >> RDS >> PostgreSQL

Maak een unieke index op een niet-unieke kolom

Een index kan alleen werkelijke rijen indexeren, geen geaggregeerde rijen. Dus ja, voor zover de gewenste index gaat, is het maken van een tabel met unieke waarden zoals u noemde uw enige optie. Dwing referentiële integriteit af met een externe sleutelbeperking van data.day tot days.day . Dit misschien ook het beste zijn voor prestaties, afhankelijk van de volledige situatie.

Aangezien dit echter gaat over prestaties , is er een alternatieve oplossing:u kunt een recursieve CTE gebruiken om een ​​losse indexscan te emuleren:

WITH RECURSIVE cte AS (
   (  -- parentheses required
   SELECT day FROM data ORDER BY 1 LIMIT 1
   )
   UNION ALL
   SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
   FROM   cte  c
   WHERE  c.day IS NOT NULL  -- exit condition
   )
SELECT day FROM cte;

Haakjes rond de eerste SELECT zijn vereist vanwege de bijgevoegde ORDER BY en LIMIT clausules. Zie:

Dit heeft alleen een duidelijke index nodig op day .

Er zijn verschillende varianten, afhankelijk van uw werkelijke vragen:

Meer in mijn antwoord op je vervolgvraag:




  1. SQL-volgordereeks als nummer

  2. Retourneer alleen numerieke waarden in MySQL

  3. hoe tekenreeksen samenvoegen?

  4. CTE-recursie om boomhiërarchie te krijgen