PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zapewnić wpisy o nienakładających się przedziałach czasowych?

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:

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:

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak uniknąć kolumny w klauzuli 'where' jeśli parametr to 'NOT PASSED' postgresql

  2. Błąd połączenia AWS RDS Postgres

  3. szyny sortuj według określonej kolejności

  4. Jak znaleźć nazwę ograniczenia w PostgreSQL

  5. SQLAlchemy create_all() nie tworzy tabel