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 .