Обработка конфликтов в индексе, когда столбцы обнуляются в Postgres - PullRequest
0 голосов
/ 07 сентября 2018

Скажем, у меня есть таблица, как:

CREATE TABLE test (id SERIAL, first VARCHAR(10), second VARCHAR(10), other VARCHAR(10));
CREATE UNIQUE INDEX unique_index ON test (first, second);

INSERT INTO test (first, second, other)
  VALUES ('lorem', null, 'old');

Если я заполню этот столбец и у второго поля в индексе будет ноль, но что делать в конфликтах, где ноль = ноль, как я могу это сделать? В настоящее время у меня нет конфликта, когда значение upsert также нулевое.

INSERT INTO test (first, second, other)
  VALUES ('lorem', null, 'new')
ON CONFLICT (first, second)
  DO UPDATE SET
    other = EXCLUDED.other;

Я получу вывод примерно так:

1   lorem   (null)  old
2   lorem   (null)  new

Это работает, если я установлю во втором столбце какое-либо значение, но при нулевом значении конфликта нет. Зачем? И как я могу это исправить?

1 Ответ

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

Вы можете создать индекс для выражения. Что часто работает, так это:

CREATE UNIQUE INDEX unique_index ON test (COALESCE(first, ''), COALESCE(second, ''));

Конечно, это предполагает, что '' не является допустимым значением поля. Вы всегда можете положить что-то еще. , , такие как '<null>'.

...