Инструменты пользователя

Инструменты сайта


update_or_insert



UPDATE OR INSERT

Модификация или вставка записи

Версии сервера

0.9 1.0 1.5.3 1.5.4 1.5.5 2.0 2.0.3 2.0.4 2.1 2.5 3.0
- - - - - - - - Да Да Да

Доступно в

Формат

  UPDATE OR INSERT INTO <table or view> [(<column_list>)]
  VALUES (<value_list>)
  [MATCHING (<column_list>)]
  [RETURNING <column_list> [INTO <variable_list>]]

Описание

В таблице проводится поиск по полям перечисленным в MATCHING.

Если записи нашлись - заменяем их. Иначе вставляем новые.

Если MATCHING не указан, то используется PRIMARY_KEY

Для успешного :?:выполнения необходимы права как на INSERT так и на UPDATE таблицы

Для успешного :!: выполнения RETURNING запрос должен работать с одной записью a

Пример

Задача: Установить правильную валюту для страны «Украина». Если этой страны нет, то завести :-)

UPDATE OR INSERT INTO country (country, currency)
VALUES ('Ukraine','hryvnia')
matching (country)

Выполняем скрипт пару раз и замечаем:

первое выполнение «1 record(s) was(were) inserted into COUNTRY» - произошла вставка

последующие «1 record(s) was(were) updated in COUNTRY» - апдейт

Ну и если учесть, что поле в MATCHING у нас совпадает с ключем таблицы, то можно смело сие предложение (matching) удалять

См. также

Источник

Firebird_v2.1.0.ReleaseNotes.pdf

Обсуждение

Роботов Андрей, 2010/09/30 15:39
  UPDATE OR INSERT INTO C_TABLE (
      DOCUMENT, WARESID, AMOUNT, PRICE, DOCSUM)
  VALUES (
      :docid, :id_wares, :quantity, :unitsalesprice , :EXTENDEDAMOUNT)
  MATCHING (DOCUMENT, WARESID, PRICE );

параметры - :docid=1985995.0 :id_wares=37658 :quantity=1 :unitsalesprice=5.36 :EXTENDEDAMOUNT=5.36 UPDATE не проходит, идет INSERT который вызывает ошибку так как у нас есть уникальный индекс I_DOCCARGO на поля DOCUMENT,WARESID,PRICE, когда деактивирую его создаеться новая запись, а мне то нужно не новая а UPDATE по имеющейся в которой в принципе то меняются только AMOUNT и DOCSUM PRICE - DOUBLE PRECISION unitsalesprice - DOUBLE PRECISION ЕСЛИ Проще то 5.36 <> 5.36 :( как поступить?

miwa, 2011/08/22 17:17

Почитать про сравнение вещественных чисел в компьютере. Здесь, например.

Sergey, 2011/11/25 17:37

А как увеличить текущее значение?

например так записать нельзя:

UPDATE OR INSERT INTO country (country, currency,sum)

VALUES ('ukraina','grivna',sum+1)

matching (country)

Compiler, 2012/09/10 17:08

UPDATE OR INSERT INTO country (country, currency,sum) VALUES ('ukraina','grivna',select

                               case sum
                                    when null then 0
                                    else sum + 1
                               end as cnt from country)

matching (country)

Compiler, 2012/09/10 17:10

Пропустил скобку перед SELECT`om но думаю догадаеьтесь

Arxangel, 2012/11/10 23:44

Да ладно… такой селект кучу строк выдаст. Тоже задался вопросом как? хз как) но судя по всему реально придётся селект с case и с where делать внутри values, где в where то же, что и в matching указать. Но это получается двойной проход по таблице… Удобно было бы как в триггере new. old. указывать что-то типо this. Но инфа 146%, что так нельзя:)

Arxangel, 2012/11/10 23:51

хотя нет, this нас не спасло бы) А вот case when inserting помогло бы. Но это только внутри триггеров написано работает

arni, 2013/05/14 08:08

Ребята, что за вредительство? Какое, нафиг, updateD or insert?

Ваш комментарий. Вики-синтаксис разрешён:
M B U Y U
 
update_or_insert.txt · Последнее изменение: 2017/01/20 16:59 — 95.165.196.178