3

我正在与 cassandra 和 CQL 作斗争。我正在定义这个表模式,

CREATE TABLE useradvisits (
  userid text,
  adid int,
  type int,
  timestamp timestamp,
  PRIMARY KEY (userid, adid, type)
 );

我想这样查询,

SELECT * from useradvisits where userid = 'user-1' and adId in (100, 1001);

但它说,Bad Request: PRIMARY KEY part adid 不能受 IN 关系限制

我正在使用最新的 datstax 企业版 3.1。

cqlsh 控制台说,

[cqlsh 3.1.2 | Cassandra 1.2.6.1 | CQL spec 3.0.0 | Thrift protocol 19.36.0]

因为我需要 (adId + type) 是唯一的,即 (100 : 1)、 (100 : 2) 都存在于用户面前。谁能帮助我如何解决?

4

2 回答 2

7

您从 addid 和 type 创建了一个复合列键。您可以将任一添加到行键以创建一个组合。只需创建一个模型,PRIMARY KEY ((userid, adid), type)您的查询就会起作用。这种方法的缺点:您将始终必须指定 adid。

您也可以相反,将类型添加到行键。如果您事先知道“类型”的范围,这可能会更好。

于 2013-08-15T09:27:20.637 回答
0

我已经使用复合分区键以这种方式更改了表。

 CREATE TABLE useradevents ( 
    userid varchar,        
    type int, 
    adId int,     
    timestamp timestamp,            
    PRIMARY KEY((userid, type), adId));

现在它的查询就像一个魅力。有人认为您需要限制类型值,在我的情况下,它只需要 3 个不同的值。

SELECT * from useradevents where userid = 'user-1' and type = 1 and adId in (100, 1001);

谢谢@omnibear!

于 2013-08-16T04:34:40.470 回答