Imagine que você tem uma tabela de folha ponto com 3 colunas, sendo delas:
- “nome” representando o nome de uma pessoa (TEXT)
- “chegada” representando uma data e horário que ela chegou no trabalho (TIMESTAMP)
- “saida” representando uma data e horário de saída da pessoa do trabalho (TIMESTAMP)
Ensinarei como criar uma constraint para que não seja permitido que uma mesma pessoa tenha 2 registros de entrada e saída onde estes registros se interseccionem (permitir apenas intervalos de tempo que não se toquem).
--Instala o índice GIST no banco de dados, permitindo usá-lo CREATE EXTENSION btree_gist; --Altera a tabela, adicionando a constraint ALTER TABLE folha_ponto ADD CONSTRAINT non_overlapping_timestamps EXCLUDE USING gist( "nome" WITH =, tsrange("chegada","saida",'[)') WITH && );
Referências
Artigo sobre tipos de índices
Ver no Medium.com
Artigo sobre tipos de índices no PostgreSQL
https://robots.thoughtbot.com/postgres-index-types
Artigo sobre criação de índices para busca textual
https://www.compose.com/articles/indexing-for-full-text-search-in-postgresql/
Artigo no DevMedia sobre vários tipos de índices do PostgreSQL
https://www.devmedia.com.br/trabalhando-com-indices-no-postgresql/34028
Documentação PostgreSQL de tipos de dados baseados em Range (intervalo)
https://www.postgresql.org/docs/current/static/rangetypes.html
Documentação PostgreSQL de tipos de índices
https://www.postgresql.org/docs/current/static/indexes-types.html
Documentação PostgreSQL de índices para busca em texto
https://www.postgresql.org/docs/current/static/textsearch-indexes.html
Documentação PostgreSQL do CREATE INDEX
https://www.postgresql.org/docs/current/static/sql-createindex.html