URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 102471
[ Назад ]

Исходное сообщение
"В СУБД PostgreSQL включена реализация UPSERT"

Отправлено opennews , 08-Май-15 22:59 
В дерево исходных текстов  СУБД PostgreSQL приняты изменения (http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;...), добавляющие функциональность "UPSERT (https://wiki.postgresql.org/wiki/UPSERT)", которая реализована через новое выражение "ON CONFLICT DO NOTHING/UPDATE" в операторе "INSERT". Новая возможность позволяет обработать ситуацию невозможности добавления данных через "INSERT", например, из-за нарушения условий уникальности или недопустимости значения одного из полей, и вместо вывода ошибки игнорировать выполнение оператора или изменить связанные с ключевым полем данные (т.е. если запись уже существует, вместо INSERT  выполнить UPDATE).


URL: https://news.ycombinator.com/item?id=9509870
Новость: http://www.opennet.me/opennews/art.shtml?num=42196


Содержание

Сообщения в этом обсуждении
"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено anonymous , 08-Май-15 22:59 
on duplicate key update. Не хватало, приходилось исключение ловить.

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено zero , 10-Май-15 10:54 
упс

тебе погло бы:

select ...
if found then
   update ...
else
   insert ...
end


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено wulf , 10-Май-15 14:13 
Есть более быстрый способ:
update
if число проапдейченых строк = 0
  insert
end

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Roman , 11-Май-15 02:56 
> update
> if число проапдейченых строк = 0

та же проблема, в то время как работает if, может быть инсерт в параллельной транзакции


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 11-Май-15 03:00 
Атомарность однако), а еще ON CONFLICT в разы быстрее хранимки

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 12-Май-15 12:26 
надо еще ошибку у инсерта обрабатывать

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Led , 11-Май-15 23:33 
> Есть более быстрый способ:
> update
> if число проапдейченых строк = 0
>   insert
> end

Ага, особенно весело, если после "update" и перед "insert" таки появится необходимая запись для "update":)


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Roman , 11-Май-15 02:52 
>> select ...
>> if found then

а если между select и insert параллельная транзакция проинсертит?


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено zero , 24-Май-15 15:06 
>>> select ...
>>> if found then
> а если между select и insert параллельная транзакция проинсертит?

Если руки из ... Если логика кривая, то ни одна команда не поможет. Транзакции изолированны и вы в любом случаи словите дубл. на коммит. Так что  ваш пример в природе в диком виде не водиться, вымирает.


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено fi , 26-Май-15 13:56 
>>> select ...
>>> if found then
> а если между select и insert параллельная транзакция проинсертит?

`select … for update`  никто не отменял!


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено AlexAT , 08-Май-15 23:04 
Не прошло и десяти лет...

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 09-Май-15 05:20 
Жиреет кадаврик. Скоро тоже станет средой программирования по типу оракла.

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено kurokaze , 09-Май-15 12:37 
С разморозкой. На том же перле уже много лет можно функции для постгри писать

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Aleks Revo , 09-Май-15 20:51 
Да и на Python. Там вообще длинный список языков

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено all_glory_to_the_hypnotoad , 09-Май-15 23:55 
Практически с самого начала таким был

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Devider , 08-Май-15 23:36 
Наркоманээ! Я ее использую в постгресе уже с пару месяцев.

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено vitalif , 08-Май-15 23:50 
Каким образом, если не секрет? Они только сегодня закоммитили в 9.5-devel. Реально ДЕНЬ ПОБЕДЫ )))) а ты на патченой сборке сидишь что ли?

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Xasd , 09-Май-15 00:52 
полезно!

"добавить-или-модифицировать" это действительно должна быть именно одна команда. очень частый сценарий использования


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 09-Май-15 09:46 
Я джва года ждал...

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 09-Май-15 10:36 
Это типа как REPLACE в MySQL только круче?

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено vitalif , 09-Май-15 10:49 
Это практически то же самое что INSERT ON DUPLICATE KEY UPDATE в MySQL.

REPLACE удаляет старые строки и вставляет их заново, а INSERT ODKU именно обновляет существующие.

Плюс в постгресовской реализации можно указывать конкретный ключ, по которому должен произойти конфликт, что полезно, т.к. предохраняет от сюрпризов, если совпадёт какой-то другой уникальный ключ, кроме первичного :-)


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 09-Май-15 14:26 
on conflict ignore = insert ignore
on conflict update = insert on duplicate key update

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 10-Май-15 10:51 
Т.е. привет, фрагментация?

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Forth , 10-Май-15 16:21 
> Т.е. привет, фрагментация?

Фрагментация чего?


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено sdfgsdg , 09-Май-15 11:32 
Постгрес крут! Время реакции - 4 дня! )))
http://www.opennet.me/openforum/vsluhforumID3/102382.html#10

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 09-Май-15 14:31 
Без апсерта жить можно, но сложно: http://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/

А в этом патче важен не столько апсерт даже, сколько реализованный механизм speculative insertion.


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 09-Май-15 16:19 
Мне нравится как апсерт (update or insert) в файрберде реализован, синтаксис логичнее и проще запомнить. Merge в оракле тоже логичен. А тут - какой-то кривоватый синтаксис.

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Roman , 09-Май-15 21:32 
о, а что же скажет маэстро про иерархические запросы?)

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 10-Май-15 15:35 
Ну, в Oracle я connect by prior использую иногда (в нашей базе есть филиалы, в каждом филиале есть подразделения, т.е. древовидная система, там есть у каждого подразделения первичный ключ и parent id (первичный ключ родительского подразделения), а так больше особо и не нахожу им применения, у нс нет больше данных, которые в виде дерева представлять удобно :)

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 10-Май-15 15:39 
> Гельфи-погроммисты в треде.

Я просто про синтаксис свое мнение высказал, в нормальные реализации апсертов минимум новых ключевых слов добавлено, ибо это просто синтаксический сахар, потому что это легко реализовать через выборку и проверку на количество возвращенных запросом строк, а тут целое новое предложение.


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 11-Май-15 03:09 
Выборка и проверка не атомарны, между ними может вклиниться insert из параллельной транзакции, кроме того это медленно, так что ON CONFLICT рулит. А по поводу иерархии, наверное вы не пользуете ее в постгресе, многословность ON CONFLICTа по сравнению с ней что ландыши на куче навоза)

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Пафнутий Корнегрызов , 10-Май-15 00:02 
Дорогие любители постгресов, порекомендуйте срафниватель схем, пожалуйста. Чтобы изменения в девелоперской базе выложить в продакшн. Заранее, спасибо

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 10-Май-15 00:44 
> Дорогие любители постгресов, порекомендуйте срафниватель схем, пожалуйста. Чтобы изменения
> в девелоперской базе выложить в продакшн. Заранее, спасибо

pg_dump + "vim -d"


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Пафнутий Корнегрызов , 10-Май-15 03:22 
> pg_dump + "vim -d"

Не, спасибо. Это не годится. Не хочу так прос... водить свою молодость. У куда менее продуманных СУБД есть отличные тулзы для сравнения схем, должно быть что-то и у постгреса. Пока только apgdiff нашёл из нормального, но он хочет яву и не поддерживает сравнение типов и вообще заброшен два года назад :-(


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Здравый , 10-Май-15 13:25 
>У куда менее продуманных СУБД есть отличные тулзы для сравнения схем

Или плати, мажорик-хотельщик, или же сиди под Emacs, VIM. А то все райской жизни ищут. Ишь, поперли погромисты.


"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Пафнутий Корнегрызов , 10-Май-15 14:15 
Я бы заплатил, так я найти не могу за что

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 10-Май-15 15:11 
В 9-ке вроде information scheme появилась. Просто ее содержимое запихивать в svn кроном а потом разглядывать дифы svn-ом не подходит?

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Пафнутий Корнегрызов , 11-Май-15 01:54 
Не, это не то, но идею вы мне подали шикарную - напишу сам. Через information_schema не надо парсер писать, если я правильно понял

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено rob pike , 11-Май-15 11:02 
Несколько готовых рабочих решений - http://dba.stackexchange.com/questions/73846/postgresql-sche...

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 12-Май-15 13:51 
И ни одно из них не работает полностью.

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 10-Май-15 09:17 
MySQL way (через ж...) ситуацию n юников на таблицу обошли стороной.

"В СУБД PostgreSQL включена реализация UPSERT"
Отправлено Аноним , 11-Май-15 03:15 
> MySQL way (через ж...) ситуацию n юников на таблицу обошли стороной.

Т.е. обошли? необходимо указывать какой уник, иначе ошибка