Почему не удается Kudu при вставке дубликата первичного ключа? - PullRequest
0 голосов
/ 31 мая 2019

Из документации Impala:

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

Почему Impala / Kudu действует так?Обратите внимание, что вставка не будет обновлять значение (для этого есть команда upsert), она просто молча завершится неудачей.

Есть ли способ узнать, что я вставляю дублирующий первичный ключ?

1 Ответ

0 голосов
/ 03 июня 2019

Это потому, что сам kudu не будет выдавать никаких исключений (только поднимать предупреждение) и, следовательно, impala (справедливо) примет задачу выполненной.

Относительно того, почему Куду решил сделать это таким образом, мы можем только строить догадки.

Это только мое мнение. Kudu (и Impala) предназначены для аналитической нагрузки вместо транзакционной нагрузки. Что обычно включает в себя пакетную обработку больших объемов данных. Было бы нежелательно, чтобы приложение не работало из-за небольшого количества записей с дублирующимися ключами.

Таким образом, поведение по умолчанию вставляет все записи с неповторяющимися ключами и пропускает все дубликаты ключей. Это можно изменить с помощью upsert, который заменяет дубликаты.

Согласно документации Imapala

Если оператор INSERT пытается вставить строку с теми же значениями для столбцов первичного ключа, что и существующая строка, эта строка отбрасывается и операция вставки продолжается. Когда строки отбрасываются из-за дублирования первичных ключей, инструкция заканчивается предупреждением, а не ошибкой. (Это изменение по сравнению с ранними выпусками Kudu, где по умолчанию в таких случаях возвращался с ошибкой, и для успешного выполнения оператора требовался синтаксис INSERT IGNORE. Предложение IGNORE больше не является частью синтаксиса INSERT.)

В ситуациях, когда вы предпочитаете заменять строки дублирующимися значениями первичного ключа, а не отбрасывать новые данные, вы можете использовать оператор UPSERT вместо INSERT. UPSERT вставляет строки, которые являются совершенно новыми, и для строк, которые соответствуют существующему первичному ключу в таблице, столбцы не первичного ключа обновляются, чтобы отразить значения в «добавленных» данных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...