Can anyone help me understand the semantics of the DELETE cql statement, 
specifically the WHERE… part?

Taken literally, the datastax documentation at 
http://docs.datastax.com/en/cql/3.1/cql/cql_reference/delete_r.html 
<http://docs.datastax.com/en/cql/3.1/cql/cql_reference/delete_r.html> seems to 
indicate a single row specification can be used. 

The documentation at https://cassandra.apache.org/doc/cql3/CQL.html#deleteStmt 
<https://cassandra.apache.org/doc/cql3/CQL.html#deleteStmt> seems to indicate 
that the row specifications can be in any order.


Here’s what I’ve found so far from testing.

- Identifiers must be primary key columns.
- A single IN clause (<identifier> IN '(' <term_list> ')') is allowed for the  
first primary key column
- Mutliple = clauses (<identifier> '=' <term>) are allowed, starting with the 
first primary key column (not already used), not skipping any, and not 
appearing before an IN clause

For example, the following work for the table:

CREATE TABLE mpk_store (
  pk_one text,
  pk_two text,
  pk_three text,
  four text,
  PRIMARY KEY (pk_one, pk_two, pk_three)
)

DELETE FROM mpk_store WHERE pk_one IN ('a', 'b') AND pk_two = 'a';
DELETE FROM mpk_store WHERE pk_one IN ('a', 'b') AND pk_two = 'a' AND pk_three 
= 'b';
DELETE FROM mpk_store WHERE pk_one IN ('a', 'b');
DELETE FROM mpk_store WHERE pk_one = 'a';

The following return Bad Request errors:

DELETE FROM mpk_store WHERE pk_one IN ('a', 'b') AND pk_two IN ('a', 'b');
DELETE FROM mpk_store WHERE pk_one = 'test_fetch_partial_limit' AND pk_two IN 
('a', 'b');
DELETE FROM mpk_store WHERE pk_one IN ('a', 'b') AND pk_two IN ('a', 'b') AND 
pk_three = 'b';

This is a bit weird, since select allows IN clauses anywhere in the statement.


Can anyone help explain these semantics or why Cassandra does this?

Thanks,
Cameron Little

Reply via email to