Jak zapewnić wpisy z nie nakładającymi się zakresami czasowymi?

głosy
50

Muszę mieć pewność, że moja baza danych zawiera tylko te wpisy, w których dwie lub więcej kolumn są unikalne. Można to łatwo osiągnąć z UNIQUEograniczeniem do tych kolumn.

W moim przypadku, muszę zabronić powielania tylko dla nakładających się zakresów czasowych. Stół ma valid_fromi valid_tokolumny. W niektórych przypadkach konieczne może być najpierw wygaszenie aktywnego wpisu przez ustawienie valid_to = now, a następnie wstawienie nowego wpisu dostosowanego do valid_from = nowi valid_to = infinity.

Wydaje się, że jestem w stanie wygasnąć wcześniejszego wpisu bez żadnych problemów za pomocą UPDATE, ale wstawienie nowego wpisu wydaje się być kłopotliwe, ponieważ moje podstawowe kolumny są obecnie UNIQUE, a zatem nie może być dodany ponownie

Myślałem o dodaniu valid_fromi valid_tojako część UNIQUEograniczenia, ale to tylko sprawiłoby, że ograniczenie byłoby bardziej luźne, i pozwolić duplikaty i nakładające się na siebie zakresy czasowe, które mają istnieć.

Utwórz 10/05/2020 o 19:31
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Byłeś na właściwej drodze. Ale składnia dla ograniczeń wykluczenia jest nieco inna:

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

W zależności od nieujawnionej definicji tabeli, może być konieczne zainstalowanie dodatkowego modułu btree_gistw pierwszej kolejności.

Każda kolumna musi być wymieniona z odpowiednim operatorem.

I potrzebny jest typ zakresu. Zakładając timestamp with time zonevalid_fromi valid_to, że wyrażenie tstzrange(valid_from, valid_to)to zrobi.

Powiązane:


Może lepszy projekt byłby relacją jeden do wielu między Twoim registrationstołem a wpisami 1-N w nowym registration_rangestole. I pewna logika do określenia aktualnie obowiązującego wpisu (dla danego punktu czasowego). Zależy od większej ilości nieujawnionych informacji.


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