Upsert в PostgreSQL

Ура, появился коммит, добавляющий к оператору INSERT «Постгреса» конструкцию, которая позволяет использовать его как upsert (в «Оракле» это конструкция MERGE, в «Майэскуэеле» — INSERT… ON DUPLICATE KEY UPDATE):
-- Обновить, если не удалась вставка
INSERT INTO distributors AS d (did, dname) VALUES (8, 'Anvil Distribution')
ON CONFLICT (did) DO UPDATE
SET dname = EXCLUDED.dname || ' (formerly ' || d.dname || ')'
WHERE d.zipcode != '21201';

-- Если не удалась вставка, ничего не делать
INSERT INTO distributors (did, dname) VALUES (10, 'Conrad International')
ON CONFLICT (did) WHERE is_active DO NOTHING;
Счастье-то какое!
8 мая 2015 11:31

Олег Волчков (инкогнито)
8 мая 2015, 16:53

В Майсиквеле апсерт это insert ... on duplicate key update ... :)

bolknote.ru (bolknote.ru)
8 мая 2015, 18:25, ответ предназначен Олегу Волчкову

Да? А в чём разница с REPLACE? Я уже очень давно с ним не работаю.

Олег Волчков (инкогнито)
8 мая 2015, 20:14

Риплейс заменяет всю строку целиком (по сути этотделит плюс инсерт), а инсерт с ондупликейтом позволяет поменять поля, т.е. инсерт плюс апдейт иф екзистс.

bolknote.ru (bolknote.ru)
8 мая 2015, 21:32, ответ предназначен Олегу Волчкову

Ага, спасибо за разъяснения!

bolknote.ru (bolknote.ru)
9 мая 2015, 13:27, ответ предназначен Олегу Волчкову

Поправил пост.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)