UPDATE

Содержание раздела
  1. Поддерживаемые сущности
  2. Поддерживаемые СУБД
  3. Особенности вставки данных в standalone-таблицы
  4. Отличия от UPSERT VALUES и INSERT VALUES
  5. Как работает запрос
  6. Перезапуск и отмена операций
  7. Статистика обработки запросов
  8. Синтаксис
    1. Ключевое слово SET
    2. Ключевое слово FROM
    3. Ключевое слово WHERE
    4. Ключевое слово RETRY
  9. Варианты ответа
  10. Ограничения
    1. Ограничения выполнения
    2. Ограничения СУБД
    3. Ограничения сущностей
    4. Ограничения партиционирования
    5. Другие ограничения
  11. Примеры
    1. Обновление столбца логической таблицы константой
    2. Обновление столбца прокси-таблицы несколькими значениями

Поддерживается в версиях:  6.9.

Запрос обновляет значения указанных столбцов во всех записях таблицы, соответствующих условию.

Значения столбца можно обновить следующим способами (см. синтаксис ниже):

  • константой;
  • значением выражения;
  • результатом SELECT-подзапроса к данным других сущностей.

Поддерживаемые сущности

Обновление значений столбцов доступно в таблицах следующих видов:

Поддерживаемые СУБД

Обновление столбцов логических таблиц доступно во всех поддерживаемых СУБД, прокси-таблиц и standalone-таблиц — только в СУБД ADB и ADP.

Особенности вставки данных в standalone-таблицы

Синтаксис обновления записей в standalone-таблице подразумевает использование внешней writable-таблицы, которая указывает на standalone-таблицу.

Отличия от UPSERT VALUES и INSERT VALUES

В отличие от UPSERT VALUES, UPDATE позволяет обновить записи, выбранные по условию, без перечисления списка идентификаторов обновляемых записей. Другое отличие заключается в том, что UPDATE позволяет обновить существующие записи, но не вставить новые, а UPSERT VALUES поддерживает как вставку новых записей, так и обновление существующих записей.

В отличие от INSERT VALUES, UPDATE обновляет значения только тех столбцов, которые указаны в запросе. В свою очередь, INSERT VALUES заполняет указанные столбцы значениями из запроса, а остальные столбцы — значениями по умолчанию.

Как работает запрос

Все столбцы, указанные в запросе, заполняются значениями из запроса во всех записях таблицы, которые соответствуют условию WHERE. Значения неуказанных столбцов остаются без изменений.

Обновление столбцов, составляющий первичный ключ логической таблицы, недоступно.

Перезапуск и отмена операций

Незавершенную операцию по обновлению данных можно перезапустить, повторив исходный запрос с ключевым словом RETRY, или отменить.

Подробнее о способах обработки незавершенных операций см. в разделе Управление операциями записи.

Статистика обработки запросов

Запросы UPDATE учитываются в категории статистики WRITE. Статистика доступна с помощью запроса GET_ENTITY_STATISTICS и GET-методов получения статистики.

Синтаксис

Обновление столбцов таблицы:

UPDATE [db_name.]table_name [[AS] alias_name]
SET column_name1 = expression1,
    column_name2 = expression2
    ...
[FROM query]
[WHERE filter_expression]

Перезапуск операции по обновлению столбцов:

RETRY UPDATE [db_name.]table_name [[AS] alias]
SET column_name1 = expression1,
    column_name2 = expression2
    ...
[FROM query]
[WHERE condition]

Параметры:

db_name

Имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию.

table_name

Имя целевой таблицы. Возможные значения:

  • имя логической таблицы,
  • имя прокси-таблицы,
  • имя внешней writable-таблицы, указывающей на standalone-таблицу.
alias

Псевдоним целевой таблицы. Может включать латинские буквы, цифры и символы подчеркивания.

column_name

Имя обновляемого столбца таблицы.

expression

Выражение для обновления значений столбца. Возможные варианты:

  • константа;
  • выражение, доступное для вычисления в целевых датасорсах;
  • (только для прокси- и standalone-таблиц) SELECT-подзапрос, доступный для исполнения в целевых датасорсах.

Ключевое слово SET

Ключевое слово SET задает список обновляемых столбцов (column_name) и выражений (expression) для обновления значений этих столбцов.

Ключевое слово FROM

Ключевое слово FROM задает SELECT-подзапрос (query), выбирающий данные для вставки в указанные столбцы таблицы.

Возможны следующие варианты выбора и вставки данных:

  • источник данных в любом датасорсе → приемник данных в том же датасорсе;
  • источник в датасорсе типа ADB → приемник в датасорсах типа ADP, ADG и (или) ADQM;
  • источник в датасорсе типа ADP → приемник в любых датасорсах типа ADP и (или) ADG.

Ключевое слово WHERE

Задает условие выбора обновляемых строк таблицы (condition). Условие может содержать сравнение с константами, подзапросы и JOIN-соединения.

Если ключевое слово не указано, обновляются все строки таблицы.

Если в условии указан SELECT-подзапрос, он должен быть доступен для исполнения во всех датасорсах, где размещены данные таблицы.

Ключевое слово RETRY

Ключевое слово RETRY перезапускает обработку незавершенной операции записи со статусом «Выполняется» и поддерживается только для логических таблиц. Подробнее обо всех способах перезапуска и отмены операций см. в разделе Управление операциями записи.

Запрос с RETRY должен полностью повторять содержимое исходного запроса, который создал перезапускаемую операцию записи.

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

Варианты ответа

В ответе возвращается:

  • объект ResultSet c одной записью при успешном выполнении запроса;
  • исключение при неуспешном выполнении запроса.

Успешный ответ содержит следующие столбцы:

  • sysCn:
    • номер выполненной операции записи — при вставке данных в логическую таблицу;
    • пустое значение — при вставке данных в прокси-таблицу или во внешнюю writable-таблицу;
  • ts:
    • дата и время завершения операции записи в формате YYYY-MM-DD hh:mm:ss.SSSSSS — при выполнении операции вне дельты;
    • пустое значение — при выполнении операции в дельте;
  • rowsAffected — количество затронутых (добавленных, измененных и удаленных) строк. Расчет значения поддерживается для СУБД ADB и ADP.

Запрос с ключевым словом RETRY возвращает в столбце rowsAffected количество строк, затронутых перезапущенной операцией записи, без тех строк, которые успела обновить операция записи до перезапуска.

Ограничения

Ограничения выполнения

  • Выполнение запроса к логической таблице недоступно, если она участвует в незавершенной операции по изменению схемы.
  • Выполнение запроса вне дельты недоступно после дельты, закрытой с будущей меткой времени относительно серверного времени.
  • Не допускается параллельное выполнение идентичных запросов.

Ограничения СУБД

  • Запрос доступен для логических таблиц, размещенных в любых СУБД из числа поддерживаемых, и для прокси-таблиц и standalone-таблиц, размещенных в СУБД ADB и ADP.

Ограничения сущностей

  • Недоступно обновление значений столбцов логической таблицы, входящих в первичный ключ.
  • Недоступно обновление столбцов материализованного представления.

Ограничения партиционирования

  • Одновременная запись данных (загрузка, вставка и удаление) в партиционированную таблицу и ее партиции недоступна.

Другие ограничения

  • Все сущности, указанные в запросе на обновление столбцов прокси- или standalone-таблицы, должны размещаться в том же датасорсе, что и целевая таблица.
  • Ключевое слово SET, указанное в запросе на обновление столбцов логической таблицы, не может содержать SELECT-подзапрос.
  • Ключевое слово RETRY недоступно в запросах к прокси-таблицам и standalone-таблицам.
  • При обработке запроса все неактивные датасорсы пропускаются без возврата ошибки. Ошибка возвращается, если не осталось ни одного активного датасорса, подходящего для исполнения запроса.

Примеры

Обновление столбца логической таблицы константой

UPDATE marketing.stores SET description = 'Магазин' WHERE description = 'Отдельный магазин'

Обновление столбца прокси-таблицы несколькими значениями

UPDATE marketing.payments_proxy SET type_code = 'RU_' || type_code WHERE currency_code = '643' OR currency_code = '810';
UPDATE marketing.payments_proxy SET type_code = 'US_' || type_code WHERE currency_code = '840';
UPDATE marketing.payments_proxy SET type_code = 'EU_' || type_code WHERE currency_code = '978';
UPDATE marketing.payments_proxy SET type_code = 'OT_' || type_code WHERE currency_code NOT IN ('643', '810', '840', '978');