PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Създайте уникален индекс на неуникална колона

Индексът може да индексира само действителни редове, а не обобщени редове. Така че, да, що се отнася до желания индекс, създаването на таблица с уникални стойности, както споменахте, е единствената ви опция. Наложете референтна цялост с ограничение за външен ключ от data.day до days.day . Това може също са най-добри за производителност, в зависимост от цялата ситуация.

Все пак, тъй като става дума запроизводителност , има алтернативно решение:можете да използвате рекурсивен CTE, за да емулирате сканиране на свободен индекс:

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;

Скоби около първия SELECT се изискват поради прикачения ORDER BY и LIMIT клаузи. Вижте:

Това се нуждае само от обикновен индекс на day .

Има различни варианти в зависимост от действителните ви заявки:

Повече в отговора ми на последващия ви въпрос:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да променя местоположението на директорията на журнала в postgresql 9.4?

  2. postgresql - не може да създаде база данни - OperationalError:изходна база данни template1 е достъпна от други потребители

  3. Функции на прозореца или общи таблични изрази:пребройте предишните редове в рамките на диапазона

  4. Как да попълните липсващите дати в PostgreSQL с помощта на generate_series

  5. ПРИСЪЕДИНЯВАНЕ към множество таблици въз основа на клеймо за време и друго условие