The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"В СУБД PostgreSQL включена реализация UPSERT"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от opennews (??) on 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
Новость: https://www.opennet.ru/opennews/art.shtml?num=42196

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "В СУБД PostgreSQL включена реализация UPSERT"  +1 +/
Сообщение от anonymous (??) on 08-Май-15, 22:59 
on duplicate key update. Не хватало, приходилось исключение ловить.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

28. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от zero (??) on 10-Май-15, 10:54 
упс

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

30. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от wulf (ok) on 10-Май-15, 14:13 
Есть более быстрый способ:
update
if число проапдейченых строк = 0
  insert
end
Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

38. "В СУБД PostgreSQL включена реализация UPSERT"  +1 +/
Сообщение от Roman (??) on 11-Май-15, 02:56 
> update
> if число проапдейченых строк = 0

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

Ответить | Правка | ^ к родителю #30 | Наверх | Cообщить модератору

39. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Аноним (??) on 11-Май-15, 03:00 
Атомарность однако), а еще ON CONFLICT в разы быстрее хранимки
Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

44. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Аноним (??) on 12-Май-15, 12:26 
надо еще ошибку у инсерта обрабатывать
Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #30 | Наверх | Cообщить модератору

37. "В СУБД PostgreSQL включена реализация UPSERT"  +1 +/
Сообщение от Roman (??) on 11-Май-15, 02:52 
>> select ...
>> if found then

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

Ответить | Правка | ^ к родителю #28 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

2. "В СУБД PostgreSQL включена реализация UPSERT"  +4 +/
Сообщение от AlexAT (ok) on 08-Май-15, 23:04 
Не прошло и десяти лет...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "В СУБД PostgreSQL включена реализация UPSERT"  –2 +/
Сообщение от Аноним (??) on 09-Май-15, 05:20 
Жиреет кадаврик. Скоро тоже станет средой программирования по типу оракла.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

11. "В СУБД PostgreSQL включена реализация UPSERT"  +2 +/
Сообщение от kurokaze (ok) on 09-Май-15, 12:37 
С разморозкой. На том же перле уже много лет можно функции для постгри писать
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

18. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Aleks Revo (ok) on 09-Май-15, 20:51 
Да и на Python. Там вообще длинный список языков
Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

20. "В СУБД PostgreSQL включена реализация UPSERT"  +2 +/
Сообщение от all_glory_to_the_hypnotoad (ok) on 09-Май-15, 23:55 
Практически с самого начала таким был
Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

3. "В СУБД PostgreSQL включена реализация UPSERT"  –1 +/
Сообщение от Devider (ok) on 08-Май-15, 23:36 
Наркоманээ! Я ее использую в постгресе уже с пару месяцев.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "В СУБД PostgreSQL включена реализация UPSERT"  +3 +/
Сообщение от vitalif (ok) on 08-Май-15, 23:50 
Каким образом, если не секрет? Они только сегодня закоммитили в 9.5-devel. Реально ДЕНЬ ПОБЕДЫ )))) а ты на патченой сборке сидишь что ли?
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Xasd (ok) on 09-Май-15, 00:52 
полезно!

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

7. "В СУБД PostgreSQL включена реализация UPSERT"  –1 +/
Сообщение от Аноним (??) on 09-Май-15, 09:46 
Я джва года ждал...
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

8. "В СУБД PostgreSQL включена реализация UPSERT"  +1 +/
Сообщение от Аноним (??) on 09-Май-15, 10:36 
Это типа как REPLACE в MySQL только круче?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

13. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Аноним (??) on 09-Май-15, 14:26 
on conflict ignore = insert ignore
on conflict update = insert on duplicate key update
Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

26. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Аноним (??) on 10-Май-15, 10:51 
Т.е. привет, фрагментация?
Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

35. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Forth email(ok) on 10-Май-15, 16:21 
> Т.е. привет, фрагментация?

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

Ответить | Правка | ^ к родителю #26 | Наверх | Cообщить модератору

10. "В СУБД PostgreSQL включена реализация UPSERT"  +1 +/
Сообщение от sdfgsdg on 09-Май-15, 11:32 
Постгрес крут! Время реакции - 4 дня! )))
https://www.opennet.ru/openforum/vsluhforumID3/102382.html#10
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

19. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Roman (??) on 09-Май-15, 21:32 
о, а что же скажет маэстро про иерархические запросы?)
Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #19 | Наверх | Cообщить модератору

40. "В СУБД PostgreSQL включена реализация UPSERT"  +1 +/
Сообщение от Аноним (??) on 11-Май-15, 03:09 
Выборка и проверка не атомарны, между ними может вклиниться insert из параллельной транзакции, кроме того это медленно, так что ON CONFLICT рулит. А по поводу иерархии, наверное вы не пользуете ее в постгресе, многословность ON CONFLICTа по сравнению с ней что ландыши на куче навоза)
Ответить | Правка | ^ к родителю #34 | Наверх | Cообщить модератору

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

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

pg_dump + "vim -d"

Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #23 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #24 | Наверх | Cообщить модератору

31. "В СУБД PostgreSQL включена реализация UPSERT"  +1 +/
Сообщение от Пафнутий Корнегрызов on 10-Май-15, 14:15 
Я бы заплатил, так я найти не могу за что
Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

32. "В СУБД PostgreSQL включена реализация UPSERT"  –1 +/
Сообщение от Аноним (??) on 10-Май-15, 15:11 
В 9-ке вроде information scheme появилась. Просто ее содержимое запихивать в svn кроном а потом разглядывать дифы svn-ом не подходит?
Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

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

42. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от rob pike on 11-Май-15, 11:02 
Несколько готовых рабочих решений - http://dba.stackexchange.com/questions/73846/postgresql-sche...
Ответить | Правка | ^ к родителю #21 | Наверх | Cообщить модератору

45. "В СУБД PostgreSQL включена реализация UPSERT"  +/
Сообщение от Аноним (??) on 12-Май-15, 13:51 
И ни одно из них не работает полностью.
Ответить | Правка | ^ к родителю #42 | Наверх | Cообщить модератору

25. "В СУБД PostgreSQL включена реализация UPSERT"  –1 +/
Сообщение от Аноним (??) on 10-Май-15, 09:17 
MySQL way (через ж...) ситуацию n юников на таблицу обошли стороной.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #25 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Слёрм
Inferno Solutions
Hosting by Ihor
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2019 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру