Cassandra - "cannot rename non primary key part" 的意思是什么?

19

我创建了一个名为users的表:

create table users (user_id text primary key, email text, first_name text, last_name text, session_token int);

我参考了DataStax网站上的CQL帮助文档。

现在我想把电子邮件列重命名为"emails"。但是当我执行命令时 -

alter table users rename email to emails;

我遇到了错误 - Bad Request: cannot rename non primary key part email

我正在使用CQL 3。我的CQLSH版本是3.1.6,C*版本是1.2.8。

为什么我不能重命名上述列?如果我运行“help alter table”命令,则会显示重命名列的选项。我应该如何重命名这个列?

3个回答

17

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

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

这篇文章有一些很棒的例子和关于Cassandra内部结构的更长讨论。

直接从文章借用一个例子,考虑这个示例列族:

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. 删除该列并添加回去,就像另一篇文章中提到的那样。这样做的一个很大的缺点是会丢失该列中的所有数据。

或者

  1. 创建一个新的列族,基本上是旧的副本,但其中所涉及的列已被重命名,并在那里重新编写数据。当然,这非常耗费计算资源。

讲解得很清楚,谢谢。一开始我以为这是个问题,但仔细想想,更改列名似乎更多是一种表面上的变化。 - Manu Chadha
为什么CQL参考(开源版本)没有提到“重命名”?http://cassandra.apache.org/doc/latest/cql/ddl.html#alter-table - kingluo

7
为了重命名字段,我只能先删除该字段,再添加新的名称。步骤如下:
alter table users drop email;
alter table users add emails text;

谢谢!但我不理解这个限制背后的原因。 - asgs
没有其他选择。不理解-1。 - V31
1
但这意味着,为了重命名,您将失去该列中的所有数据,对吗?这听起来并不太有帮助。 - Sumod
是的 @Sumod,数据将会丢失,这是正确的。然而,在那个时候没有其他选择。需要检查是否可以保留数据并更改表列类型。 - V31
您可以创建一个具有更新列的新表,然后将旧表的数据复制到其中。在删除旧表后,将新表重命名为已删除的表。虽然使用此方法不会丢失数据。 - Muhammad Zeshan Ghafoor

0

RENAME子句的主要目的是更改缺失于遗留表(使用COMPACT STORAGE创建的表)中的CQL 3生成的主键和列名的名称。


4
那并没有回答问题,应该是一条评论。 - user801154
请问您能指出说明这是目的的文档吗? - Sumod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接