Подтвердить что ты не робот

ОБНОВЛЕНИЕ становится подразумеваемым INSERT

Для Cassandra do UPDATE станет подразумеваемой INSERT, если выбранная строка не существует? То есть, если я скажу

 UPDATE users SET name = "Raedwald" WHERE id = 545127

и id - это PRIMARY KEY таблицы users, а таблица не имеет строки с ключом 545127, это будет эквивалентно

 INSERT INTO users (id, name) VALUES (545127, "Raedwald")

Я знаю, что обратное верно: INSERT для id, который уже существует, становится UPDATE строки с этим id. Документация Older Cassandra говорила о том, что вставки действительно являются "upserts" по этой причине.

Мне интересен случай для CQL3, Cassandra версии 1.2 +.

4b9b3361

Ответ 1

Да, для Cassandra UPDATE является синонимом INSERT, как описано в документации CQL, где говорится следующее о UPDATE:

Обратите внимание, что в отличие от SQL, UPDATE не проверяет предыдущее существование строки: строка создается, если она не существовала раньше, и обновляется в противном случае. Кроме того, нет никакого понятия о том, какие из созданий или обновлений произошли. На самом деле семантика INSERT и UPDATE идентична.

Для того чтобы семантика была другой, Кассандре нужно было бы прочитать, чтобы знать, существует ли строка. Cassandra оптимизирована для записи, поэтому вы всегда можете предположить, что она не читает перед записью в любой операции записи. Единственным исключением являются счетчики (если replicate_on_write = false), и в этом случае репликация при инкрементах включает чтение.

Ответ 2

Что можно сделать, так это:

UPDATE table_name SET field = false WHERE key = 55 IF EXISTS;

Это гарантирует, что ваше обновление будет истинным обновлением, а не обновлением.