PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да гарантираме записи с неприпокриващи се времеви диапазони?

Бяхте на прав път. Но синтаксис за ограничения за изключване е малко по-различен.

В зависимост от неразкритата дефиниция на таблицата може да се наложи да инсталирате разширението (допълнителен модул) btree_gist първи. Веднъж на db. Това е необходимо за моя пример, тъй като необходимият операторен клас не е инсталиран за тип integer по подразбиране:

CREATE EXTENSION btree_gist;

Вижте:

След това:

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

Всяка колона трябва да бъде посочена със съответния й оператор.

И имате нужда от тип диапазон . Споменавате отделни колони valid_from и valid_to . И също така споменавате tsrange и valid в неуспешната команда. Това е объркващо. Приемайки две timestamp колони, индекс на израз с израза tsrange(valid_from, valid_to) би го направил.

Свързани:

Обикновено, timestamptz (tstzrange ) трябва да се избере вместо timestamp (tsrange ). Вижте:

Може би , превъзходен дизайн би бил връзката "един към много" между вашата registration таблица и 1-N записи в нов registration_range маса. И някаква логика за определяне на текущо валидния запис (за всеки даден момент от време). Зависи от още неразкрита информация.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на postgresql DB с помощта на psycopg2

  2. Какво означават дробите TX и XID в инструмента pgadmin на postgres

  3. Намалете досадните известия в plpgsql

  4. currval все още не е дефиниран тази сесия, как да получите последователности от много сесии?

  5. Инсталацията на Odoo на Mac не можа да изпълни команда LESSC