The OpenNET Project / Index page

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

В СУБД PostgreSQL включена реализация UPSERT

08.05.2015 22:54

В дерево исходных текстов СУБД PostgreSQL приняты изменения, добавляющие функциональность "UPSERT" (добавить-или-модифицировать), которая реализована через новое выражение "ON CONFLICT DO NOTHING/UPDATE" в операторе "INSERT". Новая возможность позволяет обработать ситуацию невозможности добавления данных через "INSERT", например, из-за нарушения условий уникальности или недопустимости значения одного из полей, и вместо вывода ошибки игнорировать выполнение оператора или изменить связанные с ключевым полем данные (т.е. если запись уже существует, вместо INSERT выполнить UPDATE).

  1. Главная ссылка к новости (https://news.ycombinator.com/i...)
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/42196-postgresql
Ключевые слова: postgresql
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (42) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, anonymous (??), 22:59, 08/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    on duplicate key update. Не хватало, приходилось исключение ловить.
     
     
  • 2.28, zero (??), 10:54, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    упс

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

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

     
     
  • 3.30, wulf (ok), 14:13, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Есть более быстрый способ:
    update
    if число проапдейченых строк = 0
      insert
    end
     
     
  • 4.38, Roman (??), 02:56, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > update
    > if число проапдейченых строк = 0

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

     
     
  • 5.39, Аноним (-), 03:00, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Атомарность однако), а еще ON CONFLICT в разы быстрее хранимки
     
  • 5.44, Аноним (-), 12:26, 12/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    надо еще ошибку у инсерта обрабатывать
     
  • 4.43, Led (ok), 23:33, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Есть более быстрый способ:
    > update
    > if число проапдейченых строк = 0
    >   insert
    > end

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

     
  • 3.37, Roman (??), 02:52, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> select ...
    >> if found then

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

     
     
  • 4.46, zero (??), 15:06, 24/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >>> select ...
    >>> if found then
    > а если между select и insert параллельная транзакция проинсертит?

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

     
  • 4.47, fi (ok), 13:56, 26/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >>> select ...
    >>> if found then
    > а если между select и insert параллельная транзакция проинсертит?

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

     

  • 1.2, AlexAT (ok), 23:04, 08/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Не прошло и десяти лет...
     
     
  • 2.6, Аноним (-), 05:20, 09/05/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Жиреет кадаврик. Скоро тоже станет средой программирования по типу оракла.
     
     
  • 3.11, kurokaze (ok), 12:37, 09/05/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    С разморозкой. На том же перле уже много лет можно функции для постгри писать
     
     
  • 4.18, Aleks Revo (ok), 20:51, 09/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Да и на Python. Там вообще длинный список языков
     
  • 3.20, all_glory_to_the_hypnotoad (ok), 23:55, 09/05/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Практически с самого начала таким был
     

  • 1.3, Devider (ok), 23:36, 08/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Наркоманээ! Я ее использую в постгресе уже с пару месяцев.
     
     
  • 2.4, vitalif (ok), 23:50, 08/05/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Каким образом, если не секрет? Они только сегодня закоммитили в 9.5-devel. Реально ДЕНЬ ПОБЕДЫ )))) а ты на патченой сборке сидишь что ли?
     

  • 1.5, Xasd (ok), 00:52, 09/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    полезно!

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

     
  • 1.7, Аноним (-), 09:46, 09/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Я джва года ждал...
     
  • 1.8, Аноним (-), 10:36, 09/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Это типа как REPLACE в MySQL только круче?
     
     
  • 2.9, vitalif (ok), 10:49, 09/05/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Это практически то же самое что INSERT ON DUPLICATE KEY UPDATE в MySQL.

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

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

     
  • 2.13, Аноним (-), 14:26, 09/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    on conflict ignore = insert ignore
    on conflict update = insert on duplicate key update
     
     
  • 3.26, Аноним (-), 10:51, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Т.е. привет, фрагментация?
     
     
  • 4.35, Forth (ok), 16:21, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Т.е. привет, фрагментация?

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

     

  • 1.10, sdfgsdg (?), 11:32, 09/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Постгрес крут! Время реакции - 4 дня! )))
    http://www.opennet.me/openforum/vsluhforumID3/102382.html#10
     
  • 1.14, Аноним (-), 14:31, 09/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Без апсерта жить можно, но сложно: http://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/

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

     
  • 1.16, Аноним (-), 16:19, 09/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Мне нравится как апсерт (update or insert) в файрберде реализован, синтаксис логичнее и проще запомнить. Merge в оракле тоже логичен. А тут - какой-то кривоватый синтаксис.
     
     
  • 2.19, Roman (??), 21:32, 09/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    о, а что же скажет маэстро про иерархические запросы?)
     
     
  • 3.33, Аноним (-), 15:35, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, в Oracle я connect by prior использую иногда (в нашей базе есть филиалы, в каждом филиале есть подразделения, т.е. древовидная система, там есть у каждого подразделения первичный ключ и parent id (первичный ключ родительского подразделения), а так больше особо и не нахожу им применения, у нс нет больше данных, которые в виде дерева представлять удобно :)
     
  • 3.34, Аноним (-), 15:39, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Гельфи-погроммисты в треде.

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

     
     
  • 4.40, Аноним (-), 03:09, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Выборка и проверка не атомарны, между ними может вклиниться insert из параллельной транзакции, кроме того это медленно, так что ON CONFLICT рулит. А по поводу иерархии, наверное вы не пользуете ее в постгресе, многословность ON CONFLICTа по сравнению с ней что ландыши на куче навоза)
     

  • 1.21, Пафнутий Корнегрызов (?), 00:02, 10/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Дорогие любители постгресов, порекомендуйте срафниватель схем, пожалуйста. Чтобы изменения в девелоперской базе выложить в продакшн. Заранее, спасибо
     
     
  • 2.23, Аноним (-), 00:44, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Дорогие любители постгресов, порекомендуйте срафниватель схем, пожалуйста. Чтобы изменения
    > в девелоперской базе выложить в продакшн. Заранее, спасибо

    pg_dump + "vim -d"

     
     
  • 3.24, Пафнутий Корнегрызов (?), 03:22, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > pg_dump + "vim -d"

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

     
     
  • 4.29, Здравый (?), 13:25, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >У куда менее продуманных СУБД есть отличные тулзы для сравнения схем

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

     
     
  • 5.31, Пафнутий Корнегрызов (?), 14:15, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я бы заплатил, так я найти не могу за что
     
  • 2.32, Аноним (-), 15:11, 10/05/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    В 9-ке вроде information scheme появилась. Просто ее содержимое запихивать в svn кроном а потом разглядывать дифы svn-ом не подходит?
     
     
  • 3.36, Пафнутий Корнегрызов (?), 01:54, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Не, это не то, но идею вы мне подали шикарную - напишу сам. Через information_schema не надо парсер писать, если я правильно понял
     
  • 2.42, rob pike (?), 11:02, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Несколько готовых рабочих решений - http://dba.stackexchange.com/questions/73846/postgresql-schema-diff-patch-too
     
     
  • 3.45, Аноним (-), 13:51, 12/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    И ни одно из них не работает полностью.
     

  • 1.25, Аноним (-), 09:17, 10/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    MySQL way (через ж...) ситуацию n юников на таблицу обошли стороной.
     
     
  • 2.41, Аноним (-), 03:15, 11/05/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > MySQL way (через ж...) ситуацию n юников на таблицу обошли стороной.

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

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

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