Maison > base de données > tutoriel mysql > Comment la contrainte EXCLUDE de PostgreSQL peut-elle empêcher les entrées de plage de dates/heures qui se chevauchent et qui sont adjacentes ?

Comment la contrainte EXCLUDE de PostgreSQL peut-elle empêcher les entrées de plage de dates/heures qui se chevauchent et qui sont adjacentes ?

Barbara Streisand
Libérer: 2025-01-04 00:30:38
original
940 Les gens l'ont consulté

How Can PostgreSQL's EXCLUDE Constraint Prevent Overlapping and Adjacent Date/Time Range Entries?

Empêcher les entrées adjacentes/qui se chevauchent avec EXCLUDE dans PostgreSQL

Problème :

Lors de la création d'un base de données pour stocker des plages de dates/heures arbitraires, l’objectif est d’éviter les entrées superposées et adjacentes. Une contrainte utilisant une clause EXCLUDE et un index GiST est utilisée, mais des inquiétudes surgissent quant à l'hypothèse de la deuxième résolution.

Solution 1 : Suppression de la deuxième résolution

Si l'application ne nécessite qu'une deuxième résolution, en supposant que cela dans la contrainte puisse être suffisant. Cependant, les types de données à plus haute résolution peuvent nécessiter une solution plus robuste.

Solution 2 : Limites inclusives

Les limites inclusives ([]) pour les plages inférieure et supérieure permettent détection de chevauchement par une contrainte CHECK utilisant des fonctions de plage. Une contrainte EXCLUDE avec && garantit le non-chevauchement, tandis qu'une autre contrainte CHECK applique des limites inclusives.

Solution 3 : Limites canoniques

Limites canoniques ([)] facilitent la non- se chevauchent via une contrainte EXCLUDE avec &&. De plus, un opérateur adjacent (-|-) est utilisé dans une contrainte EXCLUDE distincte pour interdire les entrées adjacentes. Une contrainte CHECK garantit des valeurs liées appropriées.

Détails de mise en œuvre :

-- Solution 2: Inclusive Bounds
CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY,
  tsr tsrange,
  CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&),
  CONSTRAINT tsr_enforce_incl_bounds CHECK (lower_inc(tsr) AND upper_inc(tsr))
);

-- Solution 3: Canonical Bounds
CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY,
  tsr tsrange,
  CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&),
  CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-),
  CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))
);
Copier après la connexion

Recommandation :

La solution 3 propose un solution robuste pour gérer à la fois les entrées superposées et adjacentes, quelle que soit l'exigence de résolution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal