---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/yql/reference/syntax/upsert_into.md
  - https://ydb.tech/docs/ru/yql/reference/syntax/upsert_into.md
sourcePath: ru/core/yql/reference/syntax/upsert_into.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# UPSERT INTO

<!-- source: ru/yql/reference/_includes/limitation-column-row-in-read-only-tx-warn.md -->
{% note warning %}

<!-- source: ru/yql/reference/_includes/limitation-column-row-in-read-only-tx.md -->
В настоящее время одновременное использование [колоночных](https://ydb.tech/docs/ru/concepts/glossary.md#column-oriented-table) и [строковых](https://ydb.tech/docs/ru/concepts/glossary.md#row-oriented-table) таблиц поддерживается в транзакциях, в которых данные только читаются, но не изменяются. Поддержка транзакций с возможностью модификации данных при одновременном использовании строковых и колоночных таблиц находится в разработке.

Если попытаться выполнить операцию записи в транзакции, в которой задействованы и колоночные, и строковые таблицы, транзакция завершится с ошибкой: `Write transactions that use both row-oriented and column-oriented tables are disabled at current time`.
<!-- endsource: ru/yql/reference/_includes/limitation-column-row-in-read-only-tx.md -->

{% endnote %}
<!-- endsource: ru/yql/reference/_includes/limitation-column-row-in-read-only-tx-warn.md -->

UPSERT (расшифровывается как UPDATE or INSERT) обновляет или добавляет множество строк в таблице на основании сравнения по первичному ключу. Отсутствующие строки добавляются. В присутствующих строках обновляются значения заданных столбцов, значения остальных столбцов остаются неизменными.



`UPSERT` и [`REPLACE`](https://ydb.tech/docs/ru/yql/reference/syntax/replace_into.md) являются операциями модификации данных, которые не требует их предварительного чтения, за счет чего работают быстрее и дешевле других операций.


Сопоставление столбцов при использовании `UPSERT INTO ... SELECT` производится по именам. Используйте `AS` для получения колонки с нужным именем в `SELECT`.

## Примеры

```yql
UPSERT INTO my_table
SELECT pk_column, data_column1, col24 as data_column3 FROM other_table
```

```yql
UPSERT INTO my_table ( pk_column1, pk_column2, data_column2, data_column5 )
VALUES ( 1, 10, 'Some text', Date('2021-10-07')),
       ( 2, 10, 'Some text', Date('2021-10-08'))
```

## UPSERT INTO ... RETURNING {upsert-into-returning}

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

### Примеры

* Возврат всех значений измененной строки

```yql
UPSERT INTO orders (order_id, status, amount)
VALUES (1001, 'shipped', 500)
RETURNING *;
```

* Возврат конкретных столбцов

```yql
UPSERT INTO users (user_id, name, email)
VALUES (42, 'John Doe', 'john@example.com')
RETURNING user_id, email;
```