是否必须指定分区中的特定行才能更新和/或删除静态列?

时间:2015-10-14 21:47:52

标签: cassandra cql cassandra-2.0 cql3 nosql

UPDATE语句的CQL3规范描述以以下段落开头:

  

UPDATE语句为a中的给定行写入一个或多个列   表。 (where子句)用于选择要更新的行,必须   包括组成PRIMARY KEY的所有列(仅IN关系   支持分区键的最后一列。)其他列   值在SET关键字之后指定。

DELETE语句规范中的描述以类似段落开头:

  

DELETE语句删除列和行。如果提供了列名称   直接在DELETE关键字之后,只从行中删除这些列   由(where-clause)表示((selection)中的id [value]语法用于   集合,请参阅收集部分了解更多详情)。   否则将删除整行。 (where子句)允许指定   要删除的行的键(IN关系仅支持最后一个   分区键的列。)

这些描述中的每个描述的粗体部分都以外行的术语表示,这些语句可用于以基于行的方式修改数据。

但是,考虑到表与行之间的关系(或缺少关系)的性质(表中存在独立于任何特定行),似乎应该有一种方法来修改这样的列给定只是它们分别包含在分区的键中。但是根据规范,这似乎是不可能的,而且我不确定这是否是CQL3语法中允许这样做的难度的产物,或者别的什么。

如果无法独立于其表中的任何行更新或删除静态列,则此类操作将与其基于非静态列的对应项相结合,从而难以确定此类操作所针对的列集。例如,给定具有以下定义的填充表:

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

...如果以下DELETE语句是等效的,则不会立即显现:

//#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

所以,用我的意见形式来表达我的意见:

  1. 上述DELETE语句是否等效?
  2. 是否必须提供CQL3表中至少一行的主键才能更新或删除所述表中的静态列?如果是这样,为什么?

1 个答案:

答案 0 :(得分:3)

我不知道规范,但在真正的cassandra世界中,你的两个DELETE语句不等同于

第一个语句删除static_column而第二个语句不删除。原因是静态列由行共享。您必须指定显式才能实际删除它。

此外,我认为同时删除静态列和非静态列不是一个好主意。顺便说一句,这句话不起作用:

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

错误输出为:

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