Содержание
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
Обсуждение
параметры - :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 :( как поступить?
Почитать про сравнение вещественных чисел в компьютере. Здесь, например.
А как увеличить текущее значение?
например так записать нельзя:
UPDATE OR INSERT INTO country (country, currency,sum)
VALUES ('ukraina','grivna',sum+1)
matching (country)
UPDATE OR INSERT INTO country (country, currency,sum) VALUES ('ukraina','grivna',select
matching (country)
Пропустил скобку перед SELECT`om но думаю догадаеьтесь
Да ладно… такой селект кучу строк выдаст. Тоже задался вопросом как? хз как) но судя по всему реально придётся селект с case и с where делать внутри values, где в where то же, что и в matching указать. Но это получается двойной проход по таблице… Удобно было бы как в триггере new. old. указывать что-то типо this. Но инфа 146%, что так нельзя:)
хотя нет, this нас не спасло бы) А вот case when inserting помогло бы. Но это только внутри триггеров написано работает
Ребята, что за вредительство? Какое, нафиг, updateD or insert?