在具有实例化视图的表上删除列

sta*_*kas 4 cassandra datastax-enterprise datastax-startup

似乎在该表上有已定义的物化视图时,无法从表中删除列。例如,假设我们有此表:

> CREATE TABLE healthera.users (
>   user_id timeuuid PRIMARY KEY,
>   address text,
>   birthday int,
>   forename text,
>   user_password text,
>   username text
> );
Run Code Online (Sandbox Code Playgroud)

我们在下面定义实例化视图:

> CREATE MATERIALIZED VIEW users_by_username AS
>   SELECT * FROM users
>   WHERE user_id IS NOT NULL AND username IS NOT NULL
>   PRIMARY KEY (username, user_id);
Run Code Online (Sandbox Code Playgroud)

然后,我们更改用户表并添加一列:

> ALTER TABLE users ADD last_name text;
Run Code Online (Sandbox Code Playgroud)

当我们尝试从用户表中删除此列或任何其他列时,我们会返回此错误:

> ALTER TABLE users DROP last_name ;
> InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot drop column last_name, depended on by materialized views (healthera.{users_by_username})"
Run Code Online (Sandbox Code Playgroud)

要么

> ALTER TABLE users DROP forename ;
> InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot drop column forename, depended on by materialized views (healthera.{users_by_username})"
Run Code Online (Sandbox Code Playgroud)

这是预期的吗?我们应该如何处理呢?我们是否需要删除实例化视图,删除列,然后再次重新创建实例化视图?如果是的话,这对卡桑德拉有多贵?

小智 6

您可以在MV的基表中添加一列,但是即使它不是PK的一部分,也不能删除该列。

http://www.doanduyhai.com/blog/?p=1930

为带有数据的现有表创建MV时,它将启动构建过程以在后台填充MV。

您可以检查状态-

SELECT * FROM system.views_builds_in_progress;
SELECT * FROM system.built_views;
Run Code Online (Sandbox Code Playgroud)