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, 22:59 , 08-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,zero, 10:54 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,wulf, 14:13 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Roman, 02:56 , 11-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 03:00 , 11-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 12:26 , 12-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Led, 23:33 , 11-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Roman, 02:52 , 11-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,zero, 15:06 , 24-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,fi, 13:56 , 26-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,AlexAT, 23:04 , 08-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 05:20 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,kurokaze, 12:37 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Aleks Revo, 20:51 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,all_glory_to_the_hypnotoad, 23:55 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Devider, 23:36 , 08-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,vitalif, 23:50 , 08-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Xasd, 00:52 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 09:46 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 10:36 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,vitalif, 10:49 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 14:26 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 10:51 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Forth, 16:21 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,sdfgsdg, 11:32 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 14:31 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 16:19 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Roman, 21:32 , 09-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 15:35 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 15:39 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 03:09 , 11-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Пафнутий Корнегрызов, 00:02 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 00:44 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Пафнутий Корнегрызов, 03:22 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Здравый, 13:25 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Пафнутий Корнегрызов, 14:15 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 15:11 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Пафнутий Корнегрызов, 01:54 , 11-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,rob pike, 11:02 , 11-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 13:51 , 12-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 09:17 , 10-Май-15
- В СУБД PostgreSQL включена реализация UPSERT,Аноним, 03:15 , 11-Май-15
Сообщения в этом обсуждении
"В СУБД 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 юников на таблицу обошли стороной.Т.е. обошли? необходимо указывать какой уник, иначе ошибка