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

Насколько я понимаю, вставки и обновления в Cassandra были в основном одним и тем же. Об этом же говорится и в документации (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


person towr    schedule 03.12.2018    source источник
comment
в последнем случае вы не вставляете null, а вставляете строку: 'null'   -  person Alex Ott    schedule 03.12.2018
comment
Спасибо, я исправил этот последний случай (после двойной проверки с фактическим null).   -  person towr    schedule 03.12.2018


Ответы (1)


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

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

person Lior Chaga    schedule 04.12.2018