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

Sum*_*mod 16 cql cassandra

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

create table users (user_id text primary key, email text, first_name text, last_name text, session_token int);
Run Code Online (Sandbox Code Playgroud)

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

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

alter table users rename email to emails;
Run Code Online (Sandbox Code Playgroud)

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

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

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

fra*_*bit 14

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

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

本文有一些很棒的例子和对Cassandra内部的更长时间的讨论.

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

cqlsh:test> CREATE TABLE example (
            ... field1 int PRIMARY KEY,
            ... field2 int,
            ... field3 int);
Run Code Online (Sandbox Code Playgroud)

插入一些数据:

cqlsh:test> INSERT INTO example (field1, field2, field3) VALUES ( 1,2,3);
Run Code Online (Sandbox Code Playgroud)

然后查询此列族的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)
Run Code Online (Sandbox Code Playgroud)

主键的名称"field1"不存储在任何行中,但写出"field2"和"field3",因此更改这些名称将需要重写每一行.

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

  1. 如另一张海报所述,放下列并将其添加回来.这在删除该列中的所有数据方面存在很大的缺点.

要么

  1. 创建一个新的列族,它基本上是旧的列的副本,但是有关的列被重命名并在那里重写您的数据.当然,这在计算上非常昂贵.


V31*_*V31 6

为了重新开始这个领域,我唯一能让它工作的方法是首先删除该字段然后再添加它.所以它是这样的:

alter table users drop email;
alter table users add emails text;
Run Code Online (Sandbox Code Playgroud)

  • 丢失所有数据? (3认同)

abh*_*bhi 0

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

  • 这并不能回答问题。应该是评论。 (4认同)