Cassandra CQL - обновить (вставить), если не равно - PullRequest
0 голосов
/ 24 мая 2018

У меня есть сценарий, в котором мне нужно обновить (или вставить) запись, если (неключевое) поле не равно некоторой строке ИЛИ запись не существует.Например, что-то вроде:

UPDATE mytable SET firstname='John', lastname='Doe' WHERE id='1' IF lastname != 'Doe';

Если в настоящее время фамилия не является «Доу», обновите ее или, если запись не существует, обновите (вставьте) ее.Мое предположение состояло в том, что условие ЕСЛИ дало бы истину, если бы не было никакой записи, но очевидно нет.Есть ли альтернатива?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

В Cassandra UPDATE ведет себя очень похоже на оператор INSERT, как объясняется в документации Apache CQL:

"Обратите внимание, что в отличие от SQL, UPDATE не проверяетпредыдущее существование строки по умолчанию (кроме как через IF, см. ниже): строка создается, если ее раньше не было, и обновляется иначе. Кроме того, нет средств, чтобы узнать, произошло ли создание или обновление. "- CQL Documentation - Update

Я провел простой тест, и он сработал:

cqlsh:test_keyspace> select * from conditional_updating ;

id | firstname | lastname
----+-----------+----------

(0 rows)

cqlsh:test_keyspace> update conditional_updating 
                       set firstname = 'John', 
                           lastname = 'Doe' 
                       WHERE id = 1 IF lastname != 'Doe';

 [applied]
-----------
  True

cqlsh:test_keyspace> select * from conditional_updating ;

 id | firstname | lastname
----+-----------+----------
  1 |      John |      Doe

(1 rows)

cqlsh:test_keyspace> update conditional_updating 
                       set lastname = 'New' 
                       WHERE id = 1 IF lastname != 'Doe';

 [applied] | lastname
-----------+----------
     False |      Doe

Обратите внимание, что использование условия IF неfree Под капотом запускается облегченная транзакция (LWT) (также известная как CAS для Compara и SET).Такие запросы требуют чтения и записи, а также достижения консенсуса среди всех реплик, что делает его немного обременительным.

"Но, пожалуйста, обратите внимание, что использование условий IF повлечет за собой немалые издержки производительности (внутренне, Paxos будет использоваться), так что это должно использоваться экономно".- Документация CQL - Обновление

Если вам интересно узнать, почему облегченные транзакции считаются антишаблоном в Кассандре, я призываю вас взглянутьздесь: Легкие транзакции в Кассандре

0 голосов
/ 24 мая 2018

Пожалуйста, обратитесь к этой документации, поскольку это то, что вам нужно, и в Cassandra UPDAtE Запрос действует как вставка, если не существует. обновление с условием

Пример:

UPDATE keyspace_name.table_name
USING option AND option
SET assignment, assignment, ...
WHERE row_specification 
IF column_name = literal AND column_name = literal . . . 
IF EXISTS
...