Kevin
Kevin

Reputation: 2697

Do specific rows in a partition have to be specified in order to update and/or delete static columns?

The CQL3 specification description of the UPDATE statement begins with the following paragraph:

The UPDATE statement writes one or more columns for a given row in a table. The (where-clause) is used to select the row to update and must include all columns composing the PRIMARY KEY (the IN relation is only supported for the last column of the partition key). Other columns values are specified through after the SET keyword.

The description in the specification of the DELETE statement begins with a similar paragraph:

The DELETE statement deletes columns and rows. If column names are provided directly after the DELETE keyword, only those columns are deleted from the row indicated by the (where-clause) (the id[value] syntax in (selection) is for collection, please refer to the collection section for more details). Otherwise whole rows are removed. The (where-clause) allows to specify the key for the row(s) to delete (the IN relation is only supported for the last column of the partition key).

The bolded portions of each of these descriptions state, in layman's terms, that these statements can be used to modify data in a solely row-based manner.

However, given the nature of the relationship (or lack thereof) between the rows and the static columns (which exist independent of any particular row) of a table, it seems as though there should be a way to modify such columns given only the keys of the partitions they're respectively contained in. According to the specification however, that does not seem to be possible, and I'm not sure if that is a product of the difficulty to allow such in the CQL3 syntax, or something else.

If a static column cannot be updated or deleted independent of any row in its table, then such operations become coupled with their non-static-column-based counterparts, making the set of columns targeted by such operations, difficult to determine. For example, given a populated table with the following definition:

CREATE TABLE IF NOT EXISTS example_table
(
    partitionKeyColumn       int
    clusteringColumn         int
    nonPrimaryKeyColumn      int
    staticColumn             varchar static
    PRIMARY KEY              (partitionKeyColumn, clusteringColumn)
)

... it is not immediately obvious if the following DELETE statements are equivalent:

//#1 (Explicitly specifies all of the columns in and "in" the target row)
DELETE partitionKeyColumn, clusteringColumn, nonPrimaryKeyColumn, staticColumn FROM example_table WHERE partitionKeyColumn = 1 AND clusteringColumn = 2

//#2 (Implicitly specifies all of the columns in (but not "in"?) the target row)
DELETE FROM example_table WHERE partitionKeyColumn = 1 AND clusteringColumn = 2

So, phrasing my observations in question form:

  1. Are the above DELETE statements equivalent?
  2. Does the primary key of at least one row in a CQL3 table have to be supplied in order to update or delete a static column in said table? If so, why?

Upvotes: 0

Views: 1388

Answers (1)

Adrien Piquerez
Adrien Piquerez

Reputation: 1044

I do not know about specification but in the real cassandra world, your two DELETE statements are not equivalent.

The first statement deletes the static_column whereas the second one does not. The reason of this is that static columns are shared by rows. You have to specify it explicitly to actually delete it.

Furthermore, I do not think its a good idea to DELETE static columns and non-static columns at the same time. By the way, this statement won't work :

DELETE staticColumn FROM example_table WHERE partitionKeyColumn = 1 AND clusteringColumn = 2

The error output is :

Bad Request: Invalid restriction on clustering column priceable_name since the DELETE statement modifies only static columns

Upvotes: 3

Related Questions