我创建了一个表用户,如下所示:
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,它会显示重命名列的选项。如何重命名列?
答案 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 :(得分:6)
为了重新开始这个领域,我开始工作的唯一方法就是首先删除该字段,然后将其添加进去。所以就像这样:
alter table users drop email;
alter table users add emails text;
答案 2 :(得分:0)
RENAME子句的主要用途是更改遗留表(使用COMPACT STORAGE创建的表)中缺少的CQL 3生成的主键和列名的名称。