UPDATE
Содержание раздела
Поддерживается в версиях: 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');