Я пытаюсь использовать конфликт с уникальным в нескольких полях. У меня есть эта структура.
|---------------------|------------------|
| id | uuid |
|---------------------|------------------|
| name | string |
|---------------------|------------------|
| field_a | uuid |
|---------------------|------------------|
| field_b | uuid |
|---------------------|------------------|
| field_c | uuid |
|---------------------|------------------|
field_a,field_b,field_c
уникальны, а field_b
может быть NULL.
Это мой запрос:
INSERT INTO table (field_a, field_b,field_c, name)
values ('434d1d67-df03-4310-b3eb-93bf1c6e319e',
'd3a3745e-ad97-4fcd-1fed-26bb406dc265',
'd5a4232e-ad56-6ecd-5fed-25bb106dc114')
on conflict(field_a,field_b,field_c)
do update
set name = 'abc'
Если я снова попробую это с тем же запросом, он сработает. Он обновляется в случае конфликта. Но когда я использую null следующим образом:
INSERT INTO
table (field_a, field_b,field_c, name)
values ('434d1d67-df03-4310-b3eb-93bf1c6e319e',
null,
'd5a4232e-ad56-6ecd-5fed-25bb106dc114')
on conflict(field_a,field_b,field_c)
do update
set name = 'abc'
Это не работает. Это добавит новую строку в мою таблицу. Чтобы предотвратить добавление новой строки, я создал индекс и установил значения NULL, подобные этому
CREATE
UNIQUE INDEX uidx_uniq ON table USING btree (
(COALESCE(field_a, '00000000-0000-0000-0000-000000000000'::uuid)),
(COALESCE(field_a, '00000000-0000-0000-0000-000000000000'::uuid)),
(COALESCE(field_a, '00000000-0000-0000-0000-000000000000'::uuid)))
Это не позволяет добавлять новое значение в БД, если оно существует с нулевым значением, но при конфликте с этим не работает, это дает мне ошибку:
duplicate key value violates unique constraint "uidx_uniq"
Как я могу решить это с помощью null?