Ответ 1
В 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) из запроса этого семейства столбцов:
[[email protected]] list example;
-------------------
RowKey: 1
=> (column=, value=, timestamp=1374546754299000)
=> (column=field2, value=00000002, timestamp=1374546754299000)
=> (column=field3, value=00000003, timestamp=1374546754299000)
Имя первичного ключа "field1" не сохраняется ни в одной из строк, но "field2" и "field3" выписаны, поэтому для изменения этих имен потребуется переписать каждую строку.
Итак, если вы действительно хотите переименовать непервичный столбец, в основном существуют две разные стратегии, и ни одна из них не очень желательна.
- Отбросьте столбец и добавьте его обратно, как упоминается другой плакат. Это имеет большой недостаток, чтобы удалить все данные в этом столбце.
или
- Создайте новое семейство столбцов, которое в основном является копией старого, но с соответствующим столбцом переименовано и переписало ваши данные. Это, конечно, очень дорогостоящий расчет.