Criando constraint no PostgreSQL para impedir intersecção de intervalos (ranges) em uma tabela
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).
[code language="sql"] --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 && ); [/code]
Referências
Artigo sobre tipos de índices https://medium.com/@Alibaba_Cloud/principles-and-optimization-of-5-postgresql-indexes-btree-hash-gin-gist-and-brin-4d133e7f1842
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