当前位置: 首页 > 知识库问答 >
问题:

不能限制cassandra主键列

伯英锐
2023-03-14
CREATE TABLE vote (
    doodle_id uuid,
    user_id uuid,
    schedule_id uuid,
    vote int,
    PRIMARY KEY ((doodle_id), user_id, schedule_id)
);
select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and user_id = 97a7378a-e1bb-4586-ada1-177016405142;
select * from vote where doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 and schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633;

我得到以下错误:

Bad Request: PRIMARY KEY column "schedule_id" cannot be restricted (preceding column "user_id" is either not restricted or by a non-EQ relation)

我是Cassandra的新手,但请纠正我,如果我错了,在复合主键中,第一部分是分区键,它是强制性的,以便Cassandra知道在哪里查找数据。其馀部分是聚类键对数据进行排序。

但我还是不明白为什么我的第一个请求有效,而第二个却不行?

共有1个答案

曾修真
2023-03-14

在Cassandra中,您应该设计适合查询的数据模型。因此,支持第二个查询(通过doodle_idschedule_id进行查询,但不必使用user_id)的正确方法是创建一个新表来处理该特定查询。除了主键略有不同外,此表将基本相同:

CREATE TABLE votebydoodleandschedule (
    doodle_id uuid,
    user_id uuid,
    schedule_id uuid,
    vote int,
    PRIMARY KEY ((doodle_id), schedule_id, user_id)
);

现在这个查询可以工作了:

SELECT * FROM votebydoodleandschedule 
WHERE doodle_id = c4778a27-f2ca-4c96-8669-15dcbd5d34a7 
AND schedule_id = c37df0ad-f61d-463e-bdcc-a97586bea633;

这使得您不得不指定Allow Filtering。依赖Allow Filtering从来都不是一个好主意,当然也不应该在生产集群中这样做。

 类似资料:
  • 我试图在Cassandra CLI版本1.1.6中创建一个列族,我不确定如何将主键指定为MovieID。

  • 我在Cassandra中有一个表,定义为 我在这张表中插入了数十亿条记录。现在我想用CQL查询表 null 谢谢!

  • 请针对以下需求对Cassandra表的数据模型给出一些建议/想法。我不确定这是否可以实现。如果可以实现,我们就不需要编写外部程序了 注意:这有助于连接两个Kafka主题和任何更新发生在任何一个Kafka,两者将反映在非ormalized格式在卡桑德拉表 根据我们的要求,任何一个主键的值是相同的,应该向上。未插入。

  • 我正在从事一个laravel项目,其中我设置了一个自定义主键。但是,项目允许两个不同的条目在设置为主键的字段中具有相同的值。我如何限制这一点? 我已将模型上的public$incrementing属性设置为false,并将protected$keyType属性设置为string。 我预计代码将引发一个错误,如果我输入两个记录将相同的值在'reg_no'字段,这被定义为主要的,但记录被保存没有错误。