Comment garantir des entrées avec des plages de temps qui ne se chevauchent pas ?

voix
1

Je dois m'assurer que ma base de données ne contient que des entrées où deux ou plusieurs de ses colonnes sont uniques. Cela peut être facilement réalisé en appliquant une UNIQUEcontrainte sur ces colonnes.

Dans mon cas, je dois interdire la duplication uniquement pour les plages de temps qui se chevauchent. La table a valid_fromet valid_toles colonnes. Dans certains cas, il peut être nécessaire de faire expirer l'entrée active en définissant valid_to = now, puis en insérant une nouvelle entrée adaptée à valid_from = nowet valid_to = infinity.

Il semble que je puisse faire expirer l'entrée précédente sans problème en utilisant UPDATE, mais l'insertion de la nouvelle entrée semble être problématique puisque mes colonnes de base sont actuellement UNIQUE, et ne peuvent donc pas être ajoutées à nouveau

J'ai pensé à ajouter valid_fromet valid_tocomme faisant partie de la UNIQUEcontrainte, mais cela ne ferait que relâcher la contrainte, et permettre les doublons et les chevauchements de périodes à exister.

Créé 10/05/2020 à 19:31
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Vous étiez sur la bonne voie. Mais la syntaxe des contraintes d'exclusion est légèrement différente :

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 timestamptz
, valid_to   timestamptz
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tstzrange(valid_from, valid_to) WITH &&)
);

Vous devrez peut-être d'btree_gistabord installer le module supplémentaire, en fonction de la définition de votre table non divulguée.

Chaque colonne doit être listée avec son opérateur respectif.

Et vous avez besoin d'un type de plage. En supposant timestamp with time zoneque pour valid_fromet valid_to, l'expression tstzrange(valid_from, valid_to)ferait l'affaire.

Relié :


Peut-être qu'une conception supérieure serait une relation de un à plusieurs entre votre registrationtable et les entrées 1-N d'une nouvelle registration_rangetable. Et une certaine logique pour déterminer l'entrée actuellement valable (pour un moment donné). Dépend d'un plus grand nombre d'informations non divulguées.


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more