Почему (добавленная) строка исчезает после обновления столбца до нуля?(Но не тогда, когда он был вставлен) - PullRequest
0 голосов
/ 03 декабря 2018

Мое понимание вставок и обновлений в Кассандре было то, что они были в основном то же самое.Это также сказано в документации (https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlUpdate.html?hl=upsert)

Примечание. В отличие от команды INSERT, команда UPDATE поддерживает счетчики.В противном случае операции UPDATE и INSERT идентичны.

Так что, кроме поддержки счетчиков, они должны быть одинаковыми.

Но затем я столкнулся с проблемой, когда строки, которые создаются с помощью update, исчезли бы, если бы я установил столбцы на null, тогда как этого не произошло бы, если строки были созданы с помощью insert.

cqlsh:test> CREATE TABLE IF NOT EXISTS address_table (
               ...     name text PRIMARY KEY,
               ...     addresses text,
               ... );
cqlsh:test> insert into address_table (name, addresses) values ('Alice', 'applelane 1');
cqlsh:test> update address_table set addresses = 'broadway 2' where name = 'Bob' ;

cqlsh:test> select * from address_table;

 name  | addresses
-------+-------------
   Bob |  broadway 2
 Alice | applelane 1

(2 rows)


cqlsh:test> update address_table set addresses = null where name = 'Alice' ;
cqlsh:test> update address_table set addresses = null where name = 'Bob' ;

cqlsh:test> select * from address_table;

 name  | addresses
-------+-----------
 Alice |      null

(1 rows)

То же самое происходит, если я пропущу отдельный шаг, сначала создающий строку.С помощью insert я могу создать строку со значением null, но если я использую update, строку нигде не найти.

cqlsh:test> insert into address_table (name, addresses) values ('Caroline', null);
cqlsh:test> update address_table set addresses = null where name = 'Dexter' ;
cqlsh:test> select * from address_table;

 name     | addresses
----------+-----------
 Caroline |      null
    Alice |      null

(2 rows)

Может кто-нибудь объяснить, что происходит?

Мы используем Cassandra 3.11.3

1 Ответ

0 голосов
/ 04 декабря 2018

Это ожидаемое поведение.Подробности см. В https://issues.apache.org/jira/browse/CASSANDRA-14478

INSERT добавляет маркер строки, а UPDATE - нет.Что это значит?По сути, UPDATE запрашивает добавление отдельных ячеек строки, но не добавление самой строки;Таким образом, если позже удаляются те же отдельные ячейки с помощью команды DELETE, вся строка исчезает.Однако «INSERT» не только добавляет ячейки, но и запрашивает добавление строки (это реализуется через «маркер строки»).Таким образом, если впоследствии все отдельные ячейки строки будут удалены, за ними останется пустая строка (т. Е. Основная часть строки, которая теперь не имеет содержимого, все еще запоминается в таблице).

...