Подтвердить что ты не робот

Кассандра - Что подразумевается под "Невозможно переименовать непервичную ключевую часть"

Я создал пользователей таблицы следующим образом:

create table users (user_id text primary key, email text, first_name text, last_name text, session_token int);

Я имею в виду справочную документацию CQL на веб-сайте DataStax.

Теперь я хочу переименовать столбец электронной почты в "электронные письма". Но я выполняю команду -

alter table users rename email to emails;

Я получаю ошибку - Неверный запрос: невозможно переименовать не первичный ключевой элемент электронной почты

Я использую CQL 3. Мой CQLSH - это 3.1.6, а C * - 1.2.8.

Почему я не могу переименовать вышеуказанный столбец? Если я запустил help alter table, появится опция переименования столбца. Как переименовать столбец?

4b9b3361

Ответ 1

В 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) из запроса этого семейства столбцов:

[[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" выписаны, поэтому для изменения этих имен потребуется переписать каждую строку.

Итак, если вы действительно хотите переименовать непервичный столбец, в основном существуют две разные стратегии, и ни одна из них не очень желательна.

  • Отбросьте столбец и добавьте его обратно, как упоминается другой плакат. Это имеет большой недостаток, чтобы удалить все данные в этом столбце.

или

  1. Создайте новое семейство столбцов, которое в основном является копией старого, но с соответствующим столбцом переименовано и переписало ваши данные. Это, конечно, очень дорогостоящий расчет.

Ответ 2

Для того, чтобы ИЗМЕНИТЬ поле, единственный способ, которым я работал, - сначала удалить поле, а затем добавить его. Таким образом, это выглядит так:

alter table users drop email;
alter table users add emails text;

Ответ 3

Основная цель предложения RENAME - изменить имена генерируемых CQL 3 первичных ключей и имен столбцов, которые отсутствуют в старой таблице (таблица, созданная с помощью COMPACT STORAGE).