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

Предотвратяване на съседни/припокриващи се записи с EXCLUDE в PostgreSQL

Типовете диапазон се състоят от долна и горна граница, които могат да бъдат включени или изключени. Типичният случай на използване (и по подразбиране за типовете диапазон) е включване по-ниската и изключете горната граница.

С изключение на припокриване диапазоните изглеждат ясни. В ръководството има хубав пример за код

Освен това създайте друго ограничение за изключване, използвайки съседния оператор -|- за да изключите и съседни записи. И двете трябва да се основават на GiST индекси, тъй като GIN в момента не се поддържа за това.

За да го поддържам чист, бих наложил [) граници (включително долните и с изключение на горните) за всички записи с CHECK ограничение с помощта на функции за диапазон:

CREATE TABLE tbl (
   tbl_id serial PRIMARY KEY
 , tsr tsrange
 , CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&)
 , CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-)
 , CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))
);

db<>цигулка тук
(Стара SQL цигулка)

За съжаление, това създава две идентични GiST индекси за прилагане на двете ограничения за изключване, където едно би било достатъчно, логично. Това изглежда е недостатък на текущата реализация (до поне Postgres 11).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ActiveRecord::AdapterNotSpecified конфигурацията на базата данни не посочва адаптер

  2. Общ преглед на параметрите за свързване на PostgreSQL 13 libpq sslpassword

  3. Каква е разликата между `->>` и `->` в Postgres SQL?

  4. PostgreSql INSERT FROM SELECT RETURNING ID

  5. Често срещани грешки при мигриране на PostgreSQL бази данни от On-Prem към AWS RDS