cassandra:删除与复合主键的一个条目匹配的所有记录

时间:2018-01-30 02:32:09

标签: cassandra kotlin composite-primary-key

我有一张cassandra表,其中包含一个复合主键:(school_id, student_id)。让我们说我要删除此表中属于一所学校的所有记录。使用cassandra驱动程序,我尝试仅绑定school_id,如:

val query = QueryBuilder.delete().all().from(session.loggedKeyspace, "mytable")
   .where(QueryBuilder.eq("school_id", QueryBuilder.bindMarker())
   .bind("school_1")
session.execute(query)

我收到一条错误消息:

com.datastax.driver.core.exceptions.InvalidQueryException: Missing mandatory PRIMARY KEY part student_id

我可以在一所学校招收数千名学生。我是否必须首先查询表以获取所有不同的student_id,然后使用此删除语句?

3 个答案:

答案 0 :(得分:2)

是的,您必须提供主键的所有组件才能成功执行delete语句。您必须查询表以获取要删除的所有记录,然后通过传递school_idstudent_id

来执行删除语句

参考:DELETE | CQL for Cassandra 3.0

答案 1 :(得分:0)

您也可以删除该表,然后重新创建它。这将清理每条记录的表格:https://docs.datastax.com/en/cql/3.1/cql/cql_reference/drop_table_r.html

答案 2 :(得分:0)

是的,正如Hitesh所提到的,您必须指定分区键的所有字段。

如果你可以影响表格设计,那么将school_id作为分区键,将student_id作为聚类键可能是更好的选择:

CREATE TABLE myTable (
  school_id bigint,
  student_id bigint,
  -- other fields,
  PRIMARY KEY ((school_id), student_id)
)

在这种情况下,您可以仅使用school_id进行过滤,也可以使用school_id,student_id对进行过滤。