sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan sikrer man poster med ikke-overlappende tidsintervaller?

Du var på rette vej. Men syntaksen for ekskluderingsbegrænsninger er lidt anderledes.

Afhængigt af den ikke offentliggjorte tabeldefinition skal du muligvis installere udvidelsen (ekstra modul) btree_gist først. En gang pr. db. Det er nødvendigt for mit eksempel, da den påkrævede operatørklasse ikke er installeret for typen integer som standard:

CREATE EXTENSION btree_gist;

Se:

Så:

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

Hver kolonne skal være opført med dens respektive operator.

Og du har brug for en områdetype . Du nævner separate kolonner valid_from og valid_to . Og du nævner også tsrange og valid i den mislykkede kommando. Det er forvirrende. Forudsat to timestamp kolonner, et udtryksindeks med udtrykket tsrange(valid_from, valid_to) ville gøre det.

Relateret:

Typisk timestamptz (tstzrange ) skal vælges frem for timestamp (tsrange ). Se:

Måske , ville et overlegent design være et en-til-mange forhold mellem din registration tabel og 1-N poster i et nyt registration_range bord. Og noget logik til at bestemme den aktuelt gyldige post (for et givet tidspunkt). Afhænger af mere hemmelige oplysninger.




  1. Højest for hver gruppe

  2. Alibaba Cloud

  3. Streaming af store resultatsæt med MySQL 4.1.x + Connector/J

  4. Timestampable virker ikke med ORM og PostgreSQL database