Как использовать ON CONFLICT с ограничением исключения? - PullRequest
0 голосов
/ 30 апреля 2019

, например: индекс по userid, sdate, edate

userid  sdate       edate
001     2019-01-01  2019-01-30

, если я вставлю новые данные, такие как:

userid  sdate       edate           
001     2019-01-03  2019-01-20  
   or
001     2019-01-13  2019-02-10  
   or
001     2019-02-01  2019-02-15  

Я попытался использовать GIST ниже,но как скомбинировать его, используя ON CONFLICT?

CREATE EXTENSION btree_gist

CREATE TABLE test(
   ID INT PRIMARY KEY     NOT NULL,
   USERID     CHAR(5),
   SDATE      DATE,
   EDATE      DATE,
   EXCLUDE USING gist
   (USERID WITH =,
   daterange(SDATE, EDATE, '[]') WITH &&)
);


Insert Into test (usersid, sdate, edate)
Values  (@UsersId, @SDate, @EDate) 
ON Conflict ON CONSTRAINT  test_userid_daterange_excl 
Do Update 
   Set sdate = @SDate, edate = @EDate

Я получил:

ERROR:  ON CONFLICT DO UPDATE not supported with exclusion constraints

на основании приведенного выше сценария, я ожидаю, следующее:

userid  sdate       edate       I_EXPECT    
001     2019-01-03  2019-01-20  UPDATE because it is in range
001     2019-01-13  2019-02-10  UPDATE because it is in range
001     2019-02-01  2019-02-15  INSERT because it is not in range

выберите версию () показывает:

PostgreSQL 10.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit

1 Ответ

0 голосов
/ 30 апреля 2019

Нельзя использовать INSERT ... ON CONFLICT с индексом исключения, как говорится в сообщении об ошибке.

Вам придется использовать код, подобный примеру 43.2, из документации .

...