Hogyan biztosíthatjuk a bejegyzéseket nem átfedő időtartományokkal?

szavazat
1

Gondoskodnom kell róla, hogy az adatbázisom csak olyan bejegyzéseket tartalmazzon, ahol az oszlopok közül legalább kettő egyedi. Ez könnyen elérhető a UNIQUE kényszerítés ezekre az oszlopokra.

Saját esetemben csak az egymást átfedő időtartományokban kell megismételni. Az asztalnak van valid_from és valid_to oszlopok. Bizonyos esetekben előfordulhat, hogy először az aktív belépést kell beállítással lejárni valid_to = now , majd egy új bejegyzés beszúrása, amelynek beállítása a valid_from = now és valid_to = infinity .

Úgy tűnik, hogy bármilyen probléma nélkül lejárhatok az előző bejegyzésről UPDATE , de az új bejegyzés beszúrása zavarónak tűnik, mivel az alaposzlopok jelenleg vannak UNIQUE , ezért nem lehet újból hozzáadni.

Gondoltam hozzá valid_from és valid_to a UNIQUE kényszer, de ez csak enyhíti a kényszert, és lehetővé tenné másolatok és átfedő időtartományok létezését.

Hogyan tehetek korlátozást annak biztosítására, hogy a másolatok ne létezzenek átfedésben valid_from és valid_totsrange ?

Úgy tűnik keresem EXCLUDE USING GIST , de úgy tűnik, hogy nem támogatja több oszlopot? Úgy tűnik, hogy ez nem működik velem:

ALTER TABLE registration 
DROP Constraint IF EXISTS registration_{string.Join('_', listOfAttributes)}_key, 
ADD Constraint registration_{string.Join('_', listOfAttributes)}_key EXCLUDE USING GIST({string.Join(',', listOfAttributes)} WITH =, valid WITH &&);
A kérdést 10/05/2020 19:31
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
0

A jó úton haladtál. De a kizárási korlátok szintaxisa kissé eltér:

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

Lehet, hogy telepítenie kell a kiegészítő modult btree_gist először, a nyilvánosságra nem hozott tábla meghatározásától függően.

Minden oszlopot fel kell tüntetni a megfelelő operátorral.

És szüksége van egy tartomány típusra . Feltételezve timestamp with time zone mert valid_from és valid_to , a kifejezés tstzrange(valid_from, valid_to) megtenné.

Összefüggő:


A kiváló kialakítás talán egy-egy kapcsolat lesz a köztük registration táblázat és 1-N bejegyzés új registration_range asztal. Némi logika az aktuálisan érvényes bejegyzés meghatározására (az adott időpontra). A nyilvánosságra nem hozott információktól függ.

Válaszolt 13/05/2020 18:31
a forrás felhasználó

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