我正在与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);
但它说, 错误请求:PRIMARY KEY部分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)都存在于用户。任何人都可以帮我解决方法吗?
答案 0 :(得分:7)
您从adid和type创建了一个复合列键。您可以添加到行键以创建合成。只需使用PRIMARY KEY ((userid, adid), type)
创建模型,您的查询就可以运行。在这种方法的下方:您将始终必须指定adid。
您也可以执行相反的操作,并将类型添加到行键。如果你事先知道“类型”的范围,这可能会更好。
答案 1 :(得分: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!