【问题标题】:Cassandra - no viable alternative at input '('Cassandra - 输入'('没有可行的替代方案
【发布时间】:2018-01-12 12:50:58
【问题描述】:

我正在尝试执行一个简单的 Cassandra 表语句。我收到这样的错误。我对它有点陌生。

我的查询是:

create table orders
(
  id bigint,
  order_number bigint,
  supplier_id bigint,
  planned_delivery_date timestamp,
  flow_type int,
  store_number bigint,
  tenantid text,
  qc_locked boolean,
  qc_locked_by text,
  qc_finished_at timestamp,
  qc_finished_by text,
  qc_reviewed_at timestamp,
  qc_reviewed_by text,
  PRIMARY KEY (id,flow_type,supplier_id,(tenantid,order_number))
);

我收到一个错误:

SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="li
ne 17:40 no viable alternative at input '(' (... KEY (id,flow_type,supplier_id,[
(]...)">

【问题讨论】:

  • 你想通过向 (tenantid,order_number) 添加一组额外的括号来实现什么?
  • 这两个是复合唯一键。我不太清楚,如何在 Cassandra 中指定唯一的化合物,如果我错了,请帮助我
  • 专业发帖提示:我注意到您添加了很多闲聊/恳求的材料(我需要帮助,请帮助我,有人愿意帮忙等)。您可能会发现这对以英语为母语的人来说很烦人,因此实际上并不鼓励人们提供帮助;无论如何,由于您要将其添加到您的所有问题中,因此对于喜欢修剪这类事情的志愿编辑来说,这是更多的工作。谢谢你,如果你以后能减少它。
  • @Sun 如果有帮助,请选择其中一个答案作为正确答案!

标签: cassandra cassandra-2.0 cassandra-3.0


【解决方案1】:

如果您尝试使用复合分区键创建表,则需要在构成主键部分的列周围加上括号,而不是在剩余的集群键周围。

这将起作用:

create table orders
(
  id bigint,
  order_number bigint,
  supplier_id bigint,
  planned_delivery_date date,
  flow_type int,
  store_number bigint,
  tenantid text,
  qc_locked boolean,
  qc_locked_by text,
  qc_finished_at date,
  qc_finished_by text,
  qc_reviewed_at date,
  qc_reviewed_by text,
  PRIMARY KEY ((id,flow_type,supplier_id),tenantid,order_number)
);

【讨论】:

    【解决方案2】:

    在 Cassandra 中,主键有两部分:分区键(必需)和集群键(可选)。

    • 使用分区键可以指定 Cassandra 如何在 节点
    • 使用集群键可以指定 Cassandra 如何将数据存储在每个 节点

    在创建表格时指定主键

    PRIMARY KEY (f1, f2, f3, f4)
    

    默认情况下,第一个元素(此处为 f1)是分区键,之后的任何字段(此处为 f2, f3, f4)都被视为集群键。

    如果您想设置的分区键包含多个字段,您应该将它们放在括号中在第一个中。例如在您的代码中,假设id,flow_type,supplier_id 是分区键,您应该使用:

    create table orders
    (
      id bigint,
      order_number bigint,
      supplier_id bigint,
      planned_delivery_date timestamp,
      flow_type int,
      store_number bigint,
      tenantid text,
      qc_locked boolean,
      qc_locked_by text,
      qc_finished_at timestamp,
      qc_finished_by text,
      qc_reviewed_at timestamp,
      qc_reviewed_by text,
      PRIMARY KEY ((id,flow_type,supplier_id),tenantid,order_number)
    );
    

    注意:查询中的条件(如 where 语句)只能使用属于主键的字段(分区键和集群键)和具有辅助键的字段索引。例如,您不能对此表使用以下查询:

    SELECT * FROM orders WHERE qc_reviewed_by == "A" ;
    

    【讨论】:

      【解决方案3】:

      定义主键的语法错误,在主键中,第一部分是分区键,第二部分是聚类列。

      主键(分区键、聚类列);

      在定义主键时,您可以使用复合键或复合键。

      复合键:
      多列主键称为复合键:主键(分区键,Clustering Column);

      复合键:
      基于多列的分区键:主键((partition key1, partition key2));

      注意:
      如果您使用复合键,则查询中的 where 子句应包含用于定义分区键的所有列。

      【讨论】:

        猜你喜欢
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-30
        相关资源
        最近更新 更多