У меня есть таблица базы данных со столбцом code
, которая использует индекс в нижнем регистре для предотвращения значений кода, отличающихся только регистром (например, 'XYZ' = 'xYZ' = 'xyz').Типичным способом в Postgresql является создание индекса на основе функций, например: CREATE UNIQUE INDEX mytable_lower_code_idx ON mytable (lower(code))
.
Теперь у меня есть случай, когда мне нужно поведение upsert для этого столбца:
-- first insert
INSERT INTO mytable (code) VALUES ('abcd');
-- second insert, with upsert behaviour
INSERT INTO mytable (code) VALUES ('Abcd')
ON CONFLICT (code) DO UPDATE
SET code='Abcd';
Дляпри второй вставке я получаю нарушение уникального ключа: ERROR: duplicate key value violates unique constraint "mytable_lower_code_idx"
(я также пытался использовать ON CONFLICT ON CONSTRAINT mytable_lower_code_idx
, но Postgresql говорит мне, что это ограничение не существует, поэтому, возможно, оно не рассматривает индекс как ограничение.)
Мой последний вопрос: есть ли способ заставить INSERT ... ON CONFLICT работать вместе с индексами в выражениях?Или я должен ввести физический индексированный строчный столбец для выполнения задачи?