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

Vincolo di sovrapposizione della data di Postgres

Ok ho finito per fare questo:

CREATE TABLE test (
    from_ts TIMESTAMPTZ,
    to_ts TIMESTAMPTZ,
    account_id INTEGER DEFAULT 1,
    product_id INTEGER DEFAULT 1,
    CHECK ( from_ts < to_ts ),
    CONSTRAINT overlapping_times EXCLUDE USING GIST (
        account_id WITH =,
        product_id WITH =,
        period(from_ts, CASE WHEN to_ts IS NULL THEN 'infinity' ELSE to_ts END) WITH &&
    )
);

Funziona perfettamente con infinity, a prova di transazione.

Ho solo dovuto installare l'estensione temporale che sarà nativa in postgres 9.2 e btree_gist disponibile come estensione in 9.1 CREATE EXTENSION btree_gist;

nb :se non hai un timestamp nullo non è necessario utilizzare l'estensione temporale potresti andare con il metodo box come specificato nella mia domanda.