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:
- Erro do PostgreSQL EXCLUDE USING:tipo de dados inteiro não tem classe de operador padrão
- Como usar ( install) dblink no PostgreSQL?
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:
- Faça isso consulta de horas de operação no PostgreSQL
- Intervalos de carimbo de data/hora contínuos e sem sobreposição (tstzrange) para horários de funcionamento
- A consulta do Postgresql 9.4 fica progressivamente mais lenta ao unir TSTZRANGE com &&
- Armazenar o dia da semana e horário?
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.