我有一张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
,然后使用此删除语句?
答案 0 :(得分:2)
是的,您必须提供主键的所有组件才能成功执行delete语句。您必须查询表以获取要删除的所有记录,然后通过传递school_id
和student_id
答案 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对进行过滤。