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参考(开源版本)没有提到
重命名?