带有Equal运算符的by-columns子句中没有索引列

时间:2015-02-26 02:02:22

标签: cassandra cql cql3

我正在使用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 个答案:

答案 0 :(得分:1)

好的,这里有一些事情,所以我会一次解决一个问题。

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

    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两行:
    2. 时,这一点就变得很明显了

      -

      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对INSERTUPDATE的处理方式相同。

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

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

        不完全正确。您可以按>进行过滤或者<仅在群集列上,然后仅在分区键受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的那个。