在CQL中,您可以重命名用作主键的列,但不能更改任何其他列。这似乎与它应该是相反的,人们会认为主键需要保持不变,而其他列则很容易更改!原因在于实现细节。
主键的名称未写入每一行,而是存储在一个容易更改的不同位置。但对于非主键字段,字段的名称写入了每一行。为了重命名列,系统将不得不重写每一行。
这篇文章有一些很棒的例子和关于Cassandra内部结构的更长讨论。
直接从文章借用一个例子,考虑这个示例列族:
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" 被写出,因此更改这些名称需要重写每一行。
因此,如果您真的想要重命名非主列,则基本上有两种不同的策略,但都不太理想。
- 删除该列并添加回去,就像另一篇文章中提到的那样。这样做的一个很大的缺点是会丢失该列中的所有数据。
或者
- 创建一个新的列族,基本上是旧的副本,但其中所涉及的列已被重命名,并在那里重新编写数据。当然,这非常耗费计算资源。