Carregando...
Banco de DadosPostgreSQL

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).

--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

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *