我创建了一个表用户如下:
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",因此更改这些名称将需要重写每一行.
因此,如果您真的仍想重命名非主列,则基本上有两种不同的策略,它们都不是非常理想的.
要么
为了重新开始这个领域,我唯一能让它工作的方法是首先删除该字段然后再添加它.所以它是这样的:
alter table users drop email;
alter table users add emails text;
Run Code Online (Sandbox Code Playgroud)
RENAME 子句的主要目的是更改旧表(使用 COMPACT STORAGE 创建的表)中缺少的 CQL 3 生成的主键名称和列名称。
| 归档时间: |
|
| 查看次数: |
6404 次 |
| 最近记录: |