Vous pouvez conserver votre timestamp
séparé colonnes et toujours utiliser une contrainte d'exclusion sur une expression :
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, starts_at timestamp
, ends_at timestamp
, EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&) -- no overlapping
);
Construire une tsrange
valeur sans limites explicites comme tsrange(starts_at, ends_at)
assume automatiquement les limites par défaut :y compris le bas et exclure le haut - '[)'
, ce qui est généralement le meilleur.
SQL Fiddle.
Connexe :
- Éviter les entrées adjacentes/qui se chevauchent avec EXCLUDE dans PostgreSQL
Ajouter une contrainte au tableau existant
ALTER TABLE tbl ADD CONSTRAINT tbl_no_overlapping_time_ranges
EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&)
Les détails de la syntaxe sont les mêmes que pour CREATE TABLE
.