Как сделать 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, и этоСо временем выросло немало несвязанных деталей. Я'Я работаю над окончательными ответами.
Эти методы также полезны длявставить если не существует, иначе ничего не делатьт.е.вставить ... на дубликат ключа игнорировать ".