UPDATE
Содержание раздела
Поддерживается в версиях: 7.0 / 6.12 / 6.11 / 6.10 / 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-методов получения статистики.
Синтаксис
[RETRY] UPDATE [db_name1.]table_name [[AS] alias_name1]
SET column_name = expression
[, ... ]
[FROM { [db_name2.]entity_name [FOR SYSTEM_TIME time_expression] [[AS] alias_name2] |
(select) [AS] alias_name2 } ]
[WHERE condition]
Параметры:
db_name
-
Имя логической базы данных. Опционально, если выбрана логическая БД, используемая по умолчанию. Значения
db_name1
иdb_name2
могут как совпадать, так и отличаться. table_name
-
Имя целевой таблицы. Возможные значения:
- имя логической таблицы,
- имя прокси-таблицы,
- имя внешней writable-таблицы, указывающей на standalone-таблицу.
alias_name
-
Псевдоним таблицы или представления. Может включать латинские буквы, цифры и символы подчеркивания.
Ключевое слово SET column_name = expression
Задает имена обновляемых столбцов таблицы и выражения для обновления значений этих столбцов.
Возможные варианты выражения:
- константа;
- выражение, доступное для вычисления в целевых датасорсах;
- (только для прокси- и standalone-таблиц) SELECT-подзапрос, доступный для исполнения в целевых датасорсах.
Ключевое слово FROM { [db_name2.]entity_name [FOR SYSTEM_TIME time_expression] [[AS] alias_name2] | (select) [AS] alias_name2 }
Задает имя сущности (entity_name
) или SELECT-подзапрос (select
), которые служат источником данных. Может включать ключевое слово SYSTEM_TIME.
Возможны следующие варианты выбора и вставки данных:
- источник данных в любом датасорсе → приемник данных в том же датасорсе;
- источник в датасорсе типа ADB → приемник в датасорсах типа ADP, ADG и (или) ADQM;
- источник в датасорсе типа ADP → приемник в любых датасорсах типа ADP и (или) ADG.
Ключевое слово WHERE condition
Задает условие выбора обновляемых строк таблицы. Условие может содержать сравнение с константами, подзапросы и JOIN-соединения.
Если в условии указан SELECT-подзапрос, он должен быть доступен для исполнения во всех датасорсах, где размещены данные таблицы.
Если ключевое слово не указано, обновляются все строки таблицы.
Ключевое слово RETRY
Перезапускает обработку незавершенной операции записи со статусом 0 («Выполняется») и поддерживается только для логических таблиц. Подробнее обо всех способах перезапуска и отмены операций см. в разделе Управление операциями записи.
Запрос с 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');