Я пытаюсь сохранить записи контактов в Postgres на основе частичного уникального индекса (называемого contacts_unique_idx
) для столбца jsonb data
, логического столбца deleted
и логического столбца duplicated
:
CREATE UNIQUE INDEX contacts_uniqueness_idx ON contacts(
(data->>'customerId'),
LOWER(COALESCE(data->'data'->'profile'->'location'->>'formatted', '')), LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'given', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'middlename', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'surname', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'suffix', '')), LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'title', ''))
)
WHERE deleted = false and duplicated = false
Моя функция upsert (ниже, для краткости values
удалена) успешно вставляет одну запись контакта и несколько записей контакта, если они еще не существуют.Он также успешно обновляет существующую запись, если я передаю одно значение для сохранения, создавая новый объект jsonb в столбце data
на основе существующих данных записи и обновленных данных записи в соответствии с частью DO UPDATE
функции.
Однако при передаче более одного значения для подтверждения я получаю сообщение об ошибке: ERROR: duplicate key value violates unique constraint "contacts_unique_idx"
, уникальное ограничение, при котором должно происходить обновление.
INSERT INTO contacts (id, data)
VALUES ({uuid} :: {dataObject} jsonb)
ON CONFLICT (
(data->>'customerId'),
LOWER(COALESCE(data->'data'->'profile'->'location'->>'formatted', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'given', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'middlename', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'surname', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'suffix', '')),
LOWER(COALESCE(data->'data'->'profile'->'name'->'anglican'->>'title', ''))
)
WHERE deleted = false and duplicated = false
DO UPDATE
SET data =
jsonb_build_object(
'id', contacts.id,
'data', jsonb_build_object(
'fields',(contacts.data->'data'->>'fields')::jsonb || (excluded.data->'data'->>'fields')::jsonb,
'profile',(excluded.data->'data'->>'profile')::jsonb,
'status',contacts.data->'data'->>'status',
'contacted',contacts.data->'data'->>'contacted',
'successful',contacts.data->'data'->>'successful',
'reservation',(contacts.data->'data'->>'reservation')::jsonb
),
'meta', jsonb_build_object(
'etag',contacts.data->'meta'->>'etag',
'created',contacts.data->'meta'->>'created',
'modified',excluded.data->'meta'->>'modified',
'resource',contacts.data->'meta'->>'resource',
'createdBy',contacts.data->'meta'->>'createdBy',
'isDeleted',contacts.data-> 'meta'->>'isDeleted',
'modifiedBy',excluded.data->'meta'->>'modifiedBy'
),
'customerId',contacts.data->>'customerId',
'securityGroupId',contacts.data->>'securityGroupId'
)
RETURNING *;
Это проблема параллелизма?Почему я могу сохранить одну запись, но не несколько?