Cassandra “卡桑德拉”是什么意思;无法重命名非主键部件";

Cassandra “卡桑德拉”是什么意思;无法重命名非主键部件";,cassandra,cql,Cassandra,Cql,我创建了一个用户表,如下所示: create table users (user_id text primary key, email text, first_name text, last_name text, session_token int); 我指的是DataStax网站上的CQL帮助文档 我现在想把email列重命名为“emails”。但是当我执行命令的时候- alter table users rename email to emails; 我得到了错误- 错误请求:无法重命名

我创建了一个用户表,如下所示:

create table users (user_id text primary key, email text, first_name text, last_name text, session_token int);
我指的是DataStax网站上的CQL帮助文档

我现在想把email列重命名为“emails”。但是当我执行命令的时候-

alter table users rename email to emails;
我得到了错误- 错误请求:无法重命名非主键部分电子邮件

我正在使用CQL3。我的CQLSH是3.1.6,C*是1.2.8


为什么我不能重命名上面的列?如果我运行HelpAlterTable,它将显示重命名列的选项。如何重命名列?

重命名子句的主要目的是更改传统表(使用压缩存储创建的表)中缺少的CQL 3生成的主键名称和列名。

为了重命名字段,我使其工作的唯一方法是先删除字段,然后将其添加。所以是这样的,

alter table users drop email;
alter table users add emails text;

在CQL中,可以重命名用作主键的列,但不能重命名任何其他列。这似乎与它应该是的相反,人们会认为主键需要保持不变,而其他键则很容易更改!原因来自实施细节

主键的名称不会写入每一行,而是存储在一个容易更改的不同位置。但对于非主键字段,字段的名称会写入每一行。为了重命名列,系统必须重写每一行

有一些奇妙的例子和卡桑德拉的内部更长的讨论

直接引用一个例子,考虑这个示例栏族:

cqlsh:test> CREATE TABLE example (
            ... field1 int PRIMARY KEY,
            ... field2 int,
            ... field3 int);
插入少量数据:

cqlsh:test> INSERT INTO example (field1, field2, field3) VALUES ( 1,2,3);
然后查询此列族的Cassandra CLI输出(不是CQLSH):

[default@test] list  example;
-------------------
RowKey: 1
  => (column=, value=, timestamp=1374546754299000)
  => (column=field2, value=00000002, timestamp=1374546754299000)
  => (column=field3, value=00000003, timestamp=1374546754299000)
主键的名称“field1”不存储在任何行中,但“field2”和“field3”会被写出,因此更改这些名称需要重写每一行

因此,如果您真的还想重命名非主列,基本上有两种不同的策略,它们都不是很理想的

  • 如另一张海报所述,放下该列并将其添加回原处。这有一个很大的缺点,那就是删除该列中的所有数据
  • 创建一个新的列族,该列族基本上是旧列族的副本,但有问题的列已重命名,并在其中重写数据。当然,这在计算上非常昂贵

  • 谢谢但我不理解这一限制背后的理由,没有其他选择。不理解-1。但这意味着,为了重命名,您会丢失该列中的所有数据,对吗?这听起来不太有用耶@Sumod,数据将丢失是正确的。然而,当时没有其他选择。需要检查是否可以保留数据和更改表列类型。这并不能回答问题。应该是一个注释。您能指出说明此目的的文档吗?解释得很好,谢谢。首先,我认为这是一个问题,但再想想,更改列名更像是一个表面性的更改。为什么cql参考(开源版本)没有提到
    重命名