我正在尝试执行一个简单的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,[
(]...)">
答案 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中,主键有两部分:分区键(必需)和群集键(可选)。
在表单
中创建表时指定主键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子句应包含用于定义分区键的所有列。