我正在使用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"
发生什么事了?我在这里阅读了相关的问题,他们说我可以有一个>只要我在主键上有一个=过滤器,就过滤非主键。
答案 0 :(得分: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));
具有讽刺意味的是,这与您支持查询所需的内容非常接近。
INSERT
两行:-
aploetz@cqlsh:stackoverflow> INSERT INTO default.test (x, y) VALUES (1, 2);
aploetz@cqlsh:stackoverflow> INSERT INTO default.test (x, y) VALUES (1, 0);
aploetz@cqlsh:stackoverflow> SELECT * FROm test;
x | y
---+---
1 | 0
(1 rows)
由于x
是您唯一的PRIMARY KEY,x = 1和y = 2的值首先是INSERT
...然后下一个INSERT
会立即覆盖y
值为0.并且不仅PRIMARY KEYS是唯一的,Cassandra对INSERT
和UPDATE
的处理方式相同。
我在这里阅读了相关的问题,他们说我可以有一个>只要我在主键上有一个=过滤器,就过滤非主键。
不完全正确。您可以按>进行过滤或者<仅在群集列上,然后仅在分区键受equals限制时才使用。由于您只有一个PRIMARY KEY,x
是您的分区键,而您没有定义群集列。因此,为了支持此查询,还必须将y
定义为PRIMARY KEY的一部分,如下所示:
CREATE TABLE default.test (x int, y int, PRIMARY KEY (x,y));
包含y
作为PRIMARY KEY的一部分也有助于确保唯一性,这将允许您的表包含两行:
aploetz@cqlsh:stackoverflow> INSERT INTO default.test (x, y) VALUES (1, 2);
aploetz@cqlsh:stackoverflow> INSERT INTO default.test (x, y) VALUES (1, 0);
aploetz@cqlsh:stackoverflow> SELECT * FROm test;
x | y
---+---
1 | 0
1 | 2
(2 rows)
完成所有这些后,现在可以使用:
aploetz@cqlsh:stackoverflow> SELECT * FROM test WHERE x=1 AND y > 1;
x | y
---+---
1 | 2
(1 rows)
这是指向详细介绍CQL SELECT语句的最新文档的链接。你绝对应该给它一个阅读,一个解释Compound Keys and Clustering的那个。