Cassandra Удалить запрос с Если условие не работает - PullRequest
0 голосов
/ 15 марта 2019

У меня есть таблица cassandra, и я хочу удалить строку, но только если один столбец имеет одно конкретное значение.

Даже если cassandra утверждает, что удаление выполнено успешно (возвращается «apply: true»),сообщение все еще будет присутствовать.


Давайте создадим таблицу и вставим некоторые данные:

CREATE TABLE IF NOT EXISTS test
(
     id uuid PRIMARY KEY, 
     recipient text, 
     message text
);

INSERT INTO test (id, recipient, message) 
VALUES (7ee055ee-b5dd-4bfd-b184-614d51e268d5, 'felix', 'foo');

INSERT INTO test (id, recipient, message) 
VALUES (86c9d632-dc24-4635-8277-c987c78bd242, 'andrew', 'bar');

Теперь я хочу удалить одно сообщение, но только если пользователь, который запрашивает удаление(в данном случае felix) является получателем и, следовательно, имеет полномочия для этого:

cqlsh:service_message> DELETE FROM test WHERE id=7ee055ee-b5dd-4bfd-b184-614d51e268d5 IF recipient='felix';

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

Итак, я бы сейчас подумал, что запрос действительно прошел, но если мы посмотрим на таблицу, то увидимчто сообщение все еще существует.

cqlsh:service_message> SELECT * FROM test;

 id                                   | message | recipient
--------------------------------------+---------+-----------
 86c9d632-dc24-4635-8277-c987c78bd242 |     bar |    andrew
 7ee055ee-b5dd-4bfd-b184-614d51e268d5 |     foo |     felix

(2 rows)

Некоторая дополнительная информация:

cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4

cqlsh> DESCRIBE KEYSPACE service_message 

CREATE KEYSPACE service_message WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'}  AND durable_writes = true;

CREATE TABLE service_message.test (
    id uuid PRIMARY KEY,
    message text,
    recipient text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';

1 Ответ

0 голосов
/ 16 марта 2019

INSERT and UPDATE statements using the IF clause support lightweight transactions.

Из документов Datastax на CQL: https://docs.datastax.com/en/cql/3.3/cql/cql_using/useInsertLWT.html

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

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