Оператор SQL Upsert не работает с неиндексированным столбцом - PullRequest
0 голосов
/ 05 сентября 2018

Я использую PostgreSQL v9.6.6. Я использую следующий SQL:

insert into t_vs_config_key (name, description, is_brand_dependent)
  values ('ucp.cluster','UCP Cluster', true)
  ON CONFLICT (name) DO UPDATE SET is_brand_dependent=true;

Это приводит к следующей ошибке, поскольку столбец name не индексируется как уникальный. Я не могу добавить индекс, потому что существуют существующие данные, которые не являются уникальными.

ОШИБКА: нет уникального или исключающего ограничения, соответствующего ON КОНФЛИКТ спецификация

Вопрос Любые идеи, как сделать утверждение upsert без индекса?

Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

Как уже упоминалось в комментариях, вы не можете использовать ON CONFLICT без уникального индекса.

Однако вы можете гарантировать, что будущие вставки будут уникальными, добавив в вашу таблицу новый столбец, который указывает, являются ли строки действительными или нет, и создав частичный уникальный индекс на основе этого флага:

alter t_vs_config_key 
  add column valid boolean not null default false;

Это инициализирует все существующие строки в valid = false

Теперь для будущих строк измените значение по умолчанию для этого столбца на true

alter table t_vs_config_key
    alter column valid set default true;

и убедитесь, что больше нельзя вставлять «недопустимые» строки, добавив проверочное ограничение:

alter table t_vs_config_key  
  add constraint check_valid check (valid);

Теперь вы можете создать уникальный индекс:

create unique index on t_vs_config_key(name)
where valid;

, который можно использовать для предложения on conflict:

insert into t_vs_config_key (name, description, is_brand_dependent)
values ('ucp.cluster','UCP Cluster', true)
ON CONFLICT (name) where valid DO UPDATE 
  SET is_brand_dependent = true;

Обратите внимание на предложение where valid в выражении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...