POSTGRES - обрабатывать несколько уникальных индексов по-разному в предложении ON CONFLICT - PullRequest
0 голосов
/ 17 мая 2019

У меня есть таблица с несколькими уникальными индексами.Возможно ли ON CONFLICT UPDATE только для одного из них и DO NOTHING для всех остальных, обработка с DO NOTHING будущими уникальными индексами без возврата и изменения кодаили, по крайней мере, существующие.Пример:

ON CONFLICT (name, age)
DO UPDATE SET
    occupation = 'teacher'
ELSE ON CONFLICT(all others) DO NOTHING;

Прямо сейчас, конечно, он выдает ошибку для всех других индексов, кроме 1-го.Или, в качестве альтернативы, как лучше всего справиться с этим, чтобы не было ошибок.Спасибо.

CREATE UNIQUE INDEX index1 ON contact USING btree (name, age);
CREATE UNIQUE INDEX index2 ON contact USING btree (name, address) WHERE (address IS NOT NULL);
CREATE UNIQUE INDEX index3 ...
CREATE UNIQUE INDEX index4 ...

INSERT INTO contact
    (name,
    age,
    address,
    occupation) 
VALUES
    ('John',
    25,
    '1 main st',
    'doctor')
ON CONFLICT (name, age)
DO UPDATE SET
    occupation = 'teacher';

1 Ответ

0 голосов
/ 19 мая 2019

Как насчет того, чтобы просто избежать вставки? Это немного многословно и должно быть в курсе ваших уникальных ограничений, но по крайней мере это не должно приводить к ошибке.

INSERT INTO contact
    (name,
    age,
    address,
    occupation) 
SELECT 
    'John',
    25,
    '1 main st',
    'doctor'
WHERE NOT EXISTS (
    SELECT 1
    FROM contact WHERE 
      (name, address) = ('John', '1 main st')
      OR (... next unique constraint...)
)
ON CONFLICT (name, age)
DO UPDATE SET
    occupation = 'teacher';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...