ydb icon indicating copy to clipboard operation
ydb copied to clipboard

Возможность не фейлить INSERT, если не получилось вставить

Open uh-zuh opened this issue 2 years ago • 2 comments

Если запись уже существует, то запрос вернёт ошибку, о чём сказано тут: https://ydb.tech/ru/docs/yql/reference/syntax/insert_into

Это выбивается из общей схемы работы со всеми остальными запросами. Например, когда не получилось сделать UPDATE или DELETE ни для одной записи, то ошибки нет, а просто в статистике количество updates->rows или deletes->rows не задано.

Хочется, чтобы по аналогии возвращалось в статистике inserts->rows, тем более что может быть вставлено несколько записей через конструкцию INSERT INTO table SELECT.

Основное желание такого поведения обусловлено следующими причинами в порядке уменьшения важности:

  • Хочется получать статистику по выполненному запросу, время выполнения и т.д.
  • Хочется работать единообразно со всеми "штатными" результатами запроса, а неудачная вставка, это вполне себе "штатный" результат
  • Не хочется в каждом новом месте помнить, что есть такая уникальная ошибка, которую нужно особенным образом обрабатывать
  • Не хочется видеть такие ошибки на графиках ошибок т.к. это по сути не ошибки, а например в том же Managed Service for YDB в Yandex Cloud на графике YDB errors эти ошибки мешаются

uh-zuh avatar Aug 12 '22 00:08 uh-zuh

For now you can use SELECT + UPSERT pair, this way you can see which rows already exist and skip them.

spuchin avatar Aug 18 '22 09:08 spuchin

For now you can use SELECT + UPSERT pair, this way you can see which rows already exist and skip them.

Уже исследовал этот вопрос тут #104 и, насколько я понял, сейчас нет возможности сделать это за один YQL-запрос, только за одну транзакцию с двумя запросами к серверу в рамках этой транзакции, что сильно замедляет такие запросы, кроме того, это просто неудобно.

uh-zuh avatar Aug 30 '22 16:08 uh-zuh