Cassandra 错误代码 = 2200 [无效查询] message="物化视图 'op' 的主键中引用了未知列"

问题描述

我是 Cassandra 的新手,我正在尝试创建一个物化视图。但它不起作用。 下面是表和物化视图定义以及错误代码-

表格

CREATE TABLE my_keyspace.my_table (
    customerno text,operatorname text,customername text,operatorno text,PRIMARY KEY (customerno));

物化视图

CREATE MATERIALIZED VIEW op
AS SELECT operatorname,operatorno 
FROM my_keyspace.my_table
WHERE operatorname IS NOT NULL AND customerno IS NOT NULL 
PRIMARY KEY (operatorname,customerno);

创建物化视图时的错误消息

invalidrequest: error from server: code=2200 [invalid query] 
message="unkNown column customerno referenced in primary key
for materialized view 'op'"

customerno 是基表中的主键。

解决方法

该错误表明 customerno 也需要位于基表的 SELECT 子句中。这应该有效:

> CREATE MATERIALIZED VIEW op AS SELECT operatorname,operatorno,customerno
  FROM stackoverflow.customer_table 
  WHERE operatorname IS NOT NULL AND customerno IS NOT NULL
  PRIMARY KEY (operatorname,customerno);
,

为了补充 Aaron 的答案,您似乎运行的是旧版本的 Cassandra。

在 3.0+ 和 3.11 的更高版本中,基表的所有主键列都会自动包含在内,因此您的 CREATE 语句应该可以正常工作。

例如,如果我在 C* 3.0.10 上运行它(在 customerno 子句中没有 SELECT):

CREATE MATERIALIZED VIEW op
  AS SELECT operatorname,operatorno 
  FROM my_keyspace.my_table
  WHERE operatorname IS NOT NULL AND customerno IS NOT NULL 
  PRIMARY KEY (operatorname,customerno);

视图上的 DESCRIBE 返回:

cqlsh> DESCRIBE MATERIALIZED VIEW my_keyspace.op;

CREATE MATERIALIZED VIEW my_keyspace.op AS
    SELECT operatorname,customerno,operatorno
    FROM my_keyspace.my_table
    WHERE operatorname IS NOT NULL AND customerno IS NOT NULL
    PRIMARY KEY (operatorname,customerno)
    WITH CLUSTERING ORDER BY (customerno ASC)
    ...

自动包含 customerno

    ...
    SELECT operatorname,operatorno
    ...

干杯!