带有等于运算符的按列子句中不存在索引列
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"
发生了什么事?我在这里阅读了相关问题,他们说只要我在主键上有一个 = 过滤器,我就可以在非主键上有一个 > 过滤器。
好的,这里发生了一些事情,所以我会一个一个地解决它们。
- 您的第一个
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));
具有讽刺意味的是,这接近支持查询所需的内容。
- 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 是唯一的,INSERT
s 和 UPDATE
s 被 Cassandra 视为相同。
- 具有讽刺意味的是,支持您的查询的解决方案与支持这两个行的解决方案相同。
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。
我是使用 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"
发生了什么事?我在这里阅读了相关问题,他们说只要我在主键上有一个 = 过滤器,我就可以在非主键上有一个 > 过滤器。
好的,这里发生了一些事情,所以我会一个一个地解决它们。
- 您的第一个
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));
具有讽刺意味的是,这接近支持查询所需的内容。
- 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 是唯一的,INSERT
s 和 UPDATE
s 被 Cassandra 视为相同。
- 具有讽刺意味的是,支持您的查询的解决方案与支持这两个行的解决方案相同。
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。