ydb
ydb copied to clipboard
Возможность не фейлить INSERT, если не получилось вставить
Если запись уже существует, то запрос вернёт ошибку, о чём сказано тут: 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 эти ошибки мешаются
For now you can use SELECT + UPSERT pair, this way you can see which rows already exist and skip them.
For now you can use SELECT + UPSERT pair, this way you can see which rows already exist and skip them.
Уже исследовал этот вопрос тут #104 и, насколько я понял, сейчас нет возможности сделать это за один YQL-запрос, только за одну транзакцию с двумя запросами к серверу в рамках этой транзакции, что сильно замедляет такие запросы, кроме того, это просто неудобно.