2015-05-08 ХОССПАДИ НАКОНЕЦ-ТО!!! В PostgreSQL появился UPSERT!!!

Материал из YourcmcWiki
Перейти к: навигация, поиск

ХОССПАДИ НАКОНЕЦ-ТО!!! В PostgreSQL появился UPSERT!!!

Фича, доступная в MySQL со хрен знает каких времён! REPLACE был уже в 3-ем (~2000 год), INSERT ON DUPLICATE KEY UPDATE — с 4.1, то есть с 2003 года :)))) добавлен как раз последний — INSERT ON CONFLICT (id) DO UPDATE.

Вот прям сегодня они это закоммитили в 9.5-devel… Прям реально ДЕНЬ ПОБЕДЫ!..

http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=168d5805e4c08bed7b95d351bf097cff7c07dd65

P.S: Нет, в обобщённом виде через CTE оно не эмулируется, потому что возникают проблемы с типами — как раз сегодня пробовал и обломался. Даже вот такой кейс обламывается, если a или b — INT: WITH v (a, b) AS (VALUES ('1', '2'), ('3', '4')) UPDATE t SET t.b=v.b FROM v WHERE t.a=v.a. Работает, только если явно указать '1'::int, но получается, что через функцию-обёртку ты UPSERT уже не сделаешь — нужно типы всех колонок в приложении (там, где запрос генеришь) знать. Обойти можно только совершенно дебильным способом — WITH v (a, b) AS ((SELECT a, b FROM t LIMIT 0) UNION ALL SELECT '1', '2' UNION ALL SELECT '3', '4') UPDATE... — только в этом случае постгрес осиливает '1' и '2' к нужному типу привести.

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.