Hoe kunnen we ervoor zorgen dat er geen overlappende tijdbereiken worden ingevoerd?

stemmen
1

Ik moet ervoor zorgen dat mijn database alleen items bevat waar twee of meer van de kolommen uniek zijn. Dit kan gemakkelijk worden bereikt met een UNIQUEbeperking op die kolommen.

In mijn geval moet ik duplicatie alleen voor overlappende tijdbereiken verbieden. De tabel heeft valid_fromen valid_tokolommen. In sommige gevallen kan het nodig zijn om eerst de actieve vermelding te vervallen door het instellen valid_to = nowvan , en dan het invoegen van een nieuwe vermelding aangepast aan valid_from = nowen valid_to = infinity.

Ik schijn in staat te zijn om de vorige vermelding te vervallen zonder problemen te gebruikenUPDATE, maar het invoegen van de nieuwe vermelding lijkt lastig omdat mijn basiskolommen op dit UNIQUEmoment zijn, en dus niet opnieuw kunnen worden toegevoegd

Ik dacht aan het toevoegen valid_fromen valid_toals onderdeel van de UNIQUEbeperking, maar dat zou de beperking alleen maar losser maken, en toelaten duplicaten en overlappende tijdbereiken te bestaan.

De vraag is gesteld op 10/05/2020 om 19:31
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Je was op het juiste spoor. Maar de syntaxis voor uitsluitingsbeperkingen is iets anders:

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 &&)
);

Je moet misschien btree_gisteerst de extra module installeren, afhankelijk van je geheime tabel definitie.

Elke kolom moet worden vermeld met zijn respectievelijke operator.

En je hebt een bereiktype nodig. Ervan uitgaande timestamp with time zonedat valid_fromen valid_to, de uitdrukking tstzrange(valid_from, valid_to)zou het doen.

Gerelateerd:


Misschien zou een superieur ontwerp een één-op-veel relatie zijn tussen uw registrationtafel en 1-N vermeldingen in een nieuwe registration_rangetafel. En enige logica om de huidige geldige invoer te bepalen (voor een bepaald punt in de tijd). Hangt af van meer geheime informatie.


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