PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como garantir entradas com intervalos de tempo não sobrepostos?


Você estava no caminho certo. Mas a sintaxe para restrições de exclusão é ligeiramente diferente.

Dependendo da definição da tabela não divulgada, pode ser necessário instalar a extensão (módulo adicional) btree_gist primeiro. Uma vez por db. É necessário para o meu exemplo, pois a classe de operador necessária não está instalada para o tipo integer por padrão:
CREATE EXTENSION btree_gist;

Ver:

Então:
CREATE TABLE registration  (
  tbl_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a  integer NOT NULL
, col_b  integer NOT NULL
, valid_from timestamp
, valid_to   timestamp
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tsrange(valid_from, valid_to) WITH &&)
);

Cada coluna precisa ser listada com seu respectivo operador.

E você precisa de um tipo de intervalo . Você menciona colunas separadas valid_from e valid_to . E você também menciona tsrange e valid no comando com falha. Isso é confuso. Assumindo dois timestamp colunas, um índice de expressão com a expressão tsrange(valid_from, valid_to) faria isso.

Relacionado:

Normalmente, timestamptz (tstzrange ) deve ser escolhido em timestamp (tsrange ). Ver:

Talvez , um design superior seria uma relação um-para-muitos entre seu registration table e 1-N entradas em um novo registration_range tabela. E alguma lógica para determinar a entrada atualmente válida (para qualquer ponto no tempo). Depende de mais informações não divulgadas.