Cassandra - 意思是什么 - “不能重命名非主键部分”

时间:2014-01-16 08:14:10

标签: cassandra cql

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

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

我指的是DataStax网站上的CQL帮助文档。

我现在想将电子邮件列重命名为“电子邮件”。但是当我执行命令时我 -

alter table users rename email to emails;

我收到错误 - 错误请求:无法重命名非主要部分电子邮件

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

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

3 个答案:

答案 0 :(得分:13)

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

主键的名称不会写入每一行,而是存储在可以轻松更改的其他位置。但是对于非主键字段,字段的名称将写入每一行。为了重命名该列,系统必须重写每一行。

This article有一些很棒的例子和对Cassandra内幕的更长时间的讨论。

要直接从article借用示例,请考虑此示例列族:

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. 创建一个新的列族,它基本上是旧列的副本,但有关列重命名并在那里重写您的数据。当然,这在计算上非常昂贵。

答案 1 :(得分:6)

为了重新开始这个领域,我开始工作的唯一方法就是首先删除该字段,然后将其添加进去。所以就像这样:

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

答案 2 :(得分:0)

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