带有等于运算符的按列子句中不存在索引列

No indexed columns present in by-columns clause with Equal operator

我是使用 Cassandra 2.1.2 的 运行 CQL3,这是发生的事情(我有一个名为 default 的键空间):

cqlsh> CREATE TABLE default.test (x int, y int) PRIMARY KEY (x);
cqlsh> CREATE TABLE default.test (x int PRIMARY KEY, y int);
cqlsh> INSERT INTO default.test (x, y) VALUES (1, 2);
cqlsh> INSERT INTO default.test (x, y) VALUES (1, 0);
cqlsh> SELECT * FROM default.test WHERE x=1 AND y > 1;
code=2200 [Invalid query] message="No indexed columns present in by-columns clause with Equal operator"

发生了什么事?我在这里阅读了相关问题,他们说只要我在主键上有一个 = 过滤器,我就可以在非主键上有一个 > 过滤器。

好的,这里发生了一些事情,所以我会一个一个地解决它们。

  1. 您的第一个 CREATE TABLE 语句在句法上不正确。

-

CREATE TABLE default.test (x int, y int) PRIMARY KEY (x);

您的 PRIMARY KEY 定义需要在您的列定义中,如下所示:

CREATE TABLE default.test (x int, y int, PRIMARY KEY (x));

具有讽刺意味的是,这接近支持查询所需的内容。

  1. Cassandra 中的主键是唯一的。当我按照上面的步骤和 INSERT 两行时,这一点变得很明显:

-

aploetz@cqlsh:Whosebug> INSERT INTO default.test (x, y) VALUES (1, 2);
aploetz@cqlsh:Whosebug> INSERT INTO default.test (x, y) VALUES (1, 0);
aploetz@cqlsh:Whosebug> SELECT * FROm test;
x | y
---+---
1 | 0

(1 rows)

因为 x 是您唯一的主键,x = 1 和 y = 2 的值首先被 INSERT...然后下一个 INSERT 立即覆盖 y 的值为 0。不仅 PRIMARY KEYS 是唯一的,INSERTs 和 UPDATEs 被 Cassandra 视为相同。

  1. 具有讽刺意味的是,支持您的查询的解决方案与支持这两个行的解决方案相同。

I read the related questions on here and they said I could have a > filter on the non-primary key as long as I had an = filter on the primary key.

不完全正确。您可以仅在聚类列上按 > 或 < 进行过滤,然后仅当分区键受 equals 限制时。由于您只有一个 PRIMARY KEY,x 是您的分区键,并且您 没有定义聚类列 。因此为了支持这个查询,y 也必须被定义为 PRIMARY KEY 的一部分,像这样:

CREATE TABLE default.test (x int, y int, PRIMARY KEY (x,y));

y 作为主键的一部分也有助于确保唯一性,这将允许您的 table 包含两行:

aploetz@cqlsh:Whosebug> INSERT INTO default.test (x, y) VALUES (1, 2);
aploetz@cqlsh:Whosebug> INSERT INTO default.test (x, y) VALUES (1, 0);
aploetz@cqlsh:Whosebug> SELECT * FROm test;
x | y
---+---
1 | 0
1 | 2

(2 rows)

完成所有这些后,现在可以使用了:

aploetz@cqlsh:Whosebug> SELECT * FROM test WHERE x=1 AND y > 1;

 x | y
---+---
 1 | 2

(1 rows)

这是详细介绍 CQL SELECT statement. You should definitely give that a read, a well as this one that explains Compound Keys and Clustering 的最新文档的 link。