Cassandra - 在输入时没有可行的选择'('

时间:2018-01-11 12:20:29

标签: cassandra cassandra-2.0 cassandra-3.0

我正在尝试执行一个简单的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,[
(]...)">

3 个答案:

答案 0 :(得分:3)

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

这将有效:

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)
);

答案 1 :(得分:3)

在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" ;

答案 2 :(得分:0)

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

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

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

复合键:
多列主键称为复合键:主键(分区键,聚类列);

复合键:
基于多列的分区键:主键((分区键1,分区键2));

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