UPDATE
Содержание раздела
Поддерживается в версиях: 7.4 / 7.3 / 7.2 / 7.1 / 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
. Значения неуказанных столбцов остаются без изменений.
Обновление столбцов, составляющий первичный ключ логической таблицы, недоступно.
Перезапуск и отмена операций
Кластер с кворумом нод автоматически отменяет сбойные операции записи при типовых сбоях, исключая необходимость ручного вмешательства.
Возможности по ручному управлению операциями описаны в разделе Управление операциями записи.
Выполнение при отключенном датасорсе
Отключенный датасорс пропускается при исполнении запроса. Обновление данных считается успешным, если данные сохранены в достаточное количество датасорсов.
Статистика
Запросы UPDATE
учитываются в категории WRITE
статистики. Подробнее о категориях запросов в статистике см. в разделе GET_ENTITY_STATISTICS, о способах просмотра статистики — в разделе Управление статистикой.
Синтаксис
[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
При типовых сбоях (перебои в сети, сбой ноды и т.п.) операции отменяются автоматически и не требуют ручного управления с помощью RETRY
или других команд.
Перезапускает обработку операции записи со статусом 0 («Выполняется») в логической таблице. После него должна следовать копия исходного запроса, создавшего перезапускаемую операцию.
Если ключевое слово не указано, создается новая операция записи.
Варианты ответа
В ответе возвращается:
- объект 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');