sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur säkerställer man poster med icke-överlappande tidsintervall?

Du var på rätt spår. Men syntaxen för uteslutningsrestriktioner är något annorlunda.

Beroende på den ej avslöjade tabelldefinitionen kan du behöva installera tillägget (ytterligare modul) btree_gist först. En gång per db. Det behövs för mitt exempel eftersom den nödvändiga operatörsklassen inte är installerad för typen integer som standard:

CREATE EXTENSION btree_gist;

Se:

Sedan:

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

Varje kolumn måste listas med sin respektive operator.

Och du behöver en intervalltyp . Du nämner separata kolumner valid_from och valid_to . Och du nämner också tsrange och valid i det misslyckade kommandot. Det är förvirrande. Antag två timestamp kolumner, ett uttrycksindex med uttrycket tsrange(valid_from, valid_to) skulle göra det.

Relaterat:

Vanligtvis timestamptz (tstzrange ) bör väljas framför timestamp (tsrange ). Se:

Kanske , skulle en överlägsen design vara en en-till-många-relation mellan din registration tabell och 1-N-poster i ett nytt registration_range tabell. Och lite logik för att bestämma den för närvarande giltiga posten (för en given tidpunkt). Beror på mer hemlig information.




  1. Index (nollbaserat) måste vara större än eller lika med noll

  2. python-kodning mysql :(

  3. Refererar till yttre fråga i underfråga

  4. Hur kontrollerar man det maximala antalet tillåtna anslutningar till en Oracle-databas?