Как сделать UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) в PostgreSQL?

Очень часто задаваемый вопрос здесь, как сделать upsert, что называется MySQLINSERT ... ON DUPLICATE UPDATE и стандарт поддерживает как частьMERGE операция.

Учитывая, что PostgreSQL нене поддерживает это напрямую (до pg 9.5), как вы это делаете? Учтите следующее:

CREATE TABLE testtable (
    id integer PRIMARY KEY,
    somedata text NOT NULL
);

INSERT INTO testtable (id, somedata) VALUES
(1, 'fred'),
(2, 'bob');

А теперь представь, что ты хочешьupsert» кортежи,(2, 'Joe')(3, 'Alan')поэтому новое содержимое таблицы будет:

(1, 'fred'),
(2, 'Joe'),    -- Changed value of existing tuple
(3, 'Alan')    -- Added new tuple

Тот'о чем говорят люди при обсужденииupsert, Важно, что любой подход должен бытьбезопасно при наличии нескольких транзакций, работающих на одном столе - либо с помощью явной блокировки, либо иным способом защиты от возникающих условий гонки.

Эта тема широко обсуждается наВставить, при повторном обновлении в PostgreSQL?, но это'об альтернативах синтаксису MySQL, и этоСо временем выросло немало несвязанных деталей. Я'Я работаю над окончательными ответами.

Эти методы также полезны длявставить если не существует, иначе ничего не делатьт.е.вставить ... на дубликат ключа игнорировать ".

Ответы на вопрос(6)

Ваш ответ на вопрос