Как использовать ON CONFLICT с ограничением исключения?
Например : индекс по 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 ответ
Решение
Вы не можете использовать INSERT ... ON CONFLICT
с индексом исключения, как говорится в сообщении об ошибке.
Вы должны будете использовать код как в примере 43.2 из документации.