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

Практически ограничения на изразните индекси в PostgreSQL

Никога не съм играл с hstore, но правя нещо подобно, когато имам нужда от EAV колона, напр.:

create index on product_eav (eav_value) where (eav_type = 'int');

Ограничението при това е, че трябва да сте изрични в заявката си, за да я използвате, т.е. тази заявка няма да използва горния индекс:

select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size;

Но този би:

select product_id
from product_eav
where eav_name = 'size'
and eav_value = :size
and type = 'int';

Във вашия пример вероятно трябва да изглежда по-скоро:

create index on product ((data->'size')::int) where (data->'size' is not null);

Това трябва да избягва добавянето на препратка към индекса, когато няма запис за размер. В зависимост от версията на PG, която използвате, може да се наложи заявката да бъде модифицирана по следния начин:

select product_id
from products
where data->'size' is not null
and data->'size' = :size;

Друга голяма разлика между обикновения и частичния индекс е, че последният не може да наложи уникално ограничение в дефиниция на таблица. Това ще успее:

create unique index foo_bar_key on foo (bar) where (cond);

Следното няма да:

alter table foo add constraint foo_bar_key unique (bar) where (cond);

Но това ще:

alter table foo add constraint foo_bar_excl exclude (bar with =) where (cond);



  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 агрегати с множество параметри

  2. Как да сортирате обекти в масив в json или jsonb стойност по свойство на обектите?

  3. Как да променя формата на датата в Postgres?

  4. Pandas записване на рамка от данни в друга postgresql схема

  5. Разрешете достъп до Postgresql от всеки компютър