PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Contrainte Postgres pour une plage datetime unique

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 .