Byłeś na dobrej drodze. Ale składnia ograniczeń wykluczenia jest nieco inny.
W zależności od nieujawnionej definicji tabeli może być konieczne zainstalowanie rozszerzenia
(dodatkowy moduł) btree_gist
pierwszy. Raz na db. Jest to potrzebne w moim przykładzie, ponieważ wymagana klasa operatora nie jest zainstalowana dla typu integer
domyślnie:
CREATE EXTENSION btree_gist;
Zobacz:
- Błąd PostgreSQL EXCLUDE USING:typ danych nie ma domyślnej klasy operatora
- Jak używać ( zainstalować) dblink w PostgreSQL?
Następnie:
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 timestamp
, valid_to timestamp
, CONSTRAINT no_overlap
EXCLUDE USING gist (col_a with =, col_b with =, tsrange(valid_from, valid_to) WITH &&)
);
Każda kolumna musi być wymieniona z odpowiednim operatorem.
I potrzebujesz typu zakresu . Wspominasz oddzielne kolumny valid_from
i valid_to
. Wspominasz również o tsrange
i valid
w nieudanym poleceniu. To mylące. Zakładając dwa timestamp
kolumny, indeks wyrażenia z wyrażeniem tsrange(valid_from, valid_to)
zrobiłby to.
Powiązane:
- Wykonaj to godziny pracy zapytania w PostgreSQL
- Nienakładające się, ciągłe zakresy sygnatur czasowych (tstzrange) dla godzin otwarcia
- Kwerendy Postgresql 9.4 stają się coraz wolniejsze podczas dołączania do TSTZRANGE za pomocą &&
- Przechowuj dzień tygodnia i godzinę?
Zazwyczaj timestamptz
(tstzrange
) należy wybrać zamiast timestamp
(tsrange
). Zobacz:
Może , lepszym projektem byłaby relacja jeden-do-wielu między Twoją registration
tabela i 1-N wpisów w nowym registration_range
stół. I trochę logiki do określenia aktualnie ważnego wpisu (dla dowolnego punktu w czasie). Zależy od bardziej nieujawnionych informacji.