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

You should also read: