Как уже упоминалось в комментариях, вы не можете использовать 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
в выражении.