Cassandra Язык запросов (CQL): вставка, обновление и удаление.
⚡ Умное резюме
Cassandra Язык запросов обрабатывает операции вставки, обновления, удаления и чтения с синтаксисом, близким к SQL, но с другой семантикой. На этой странице рассматривается каждое операторное выражение, поведение операции upsert, объединяющей вставку и обновление, а также реальные ограничения предложения WHERE.
Вставить данные
Cassandra Оператор вставки записывает данные в Cassandra столбцы в виде строк. Cassandra Запрос на вставку сохранит только те столбцы, которые указаны пользователем. Вам обязательно нужно указать только столбец первичного ключа.
Для не заданных значений не потребуется места. После вставки результаты не возвращаются.
Синтаксис
INSERT INTO KeyspaceName.TableName (ColumnName1, ColumnName2, ColumnName3) VALUES (Column1Value, Column2Value, Column3Value);
Пример
Вот снимок казнённого Cassandra Вставить в таблицу запрос, который вставит одну запись в Cassandra стол «Студент».
INSERT INTO University.Student (RollNo, Name, dept, Semester) VALUES (2, 'Michael', 'CS', 2);
После успешного выполнения команды Вставить в Cassandra, одна строка будет вставлена в Cassandra Таблица Студент с номером 2, имя Михаил, кафедра CS и семестр 2.
Вот снимок текущего состояния базы данных.
Обновить данные
Cassandra расстраивает. Упсерт означает, что Cassandra вставит строку, если первичный ключ еще не существует; в противном случае, если первичный ключ уже существует, эта строка будет обновлена.
Это имеет важное практическое последствие, которое стоит отметить прямо: операция INSERT никогда не сообщает об ошибке дублирования ключа, поэтому случайная повторная вставка перезаписывает существующую строку без предупреждения. Когда этого необходимо избежать, добавьте IF NOT EXISTS, чтобы сделать операцию легковесной транзакцией.
INSERT INTO University.Student (RollNo, Name) VALUES (2, 'Michael') IF NOT EXISTS;
Облегченные транзакции используют раунд консенсуса между репликами, поэтому они значительно медленнее обычной записи и должны использоваться только в тех случаях, когда проверка действительно необходима.
Обновить данные
Cassandra Запрос на обновление используется для обновления данных в Cassandra (см. таблицу ниже). Если после обновления данных результаты не возвращаются, это означает, что данные успешно обновлены, в противном случае будет возвращена ошибка. Значения столбцов изменяются в предложении «Set», а данные фильтруются с помощью предложения «Where».
Синтаксис
UPDATE KeyspaceName.TableName SET ColumnName1 = NewValue1, ColumnName2 = NewValue2 WHERE ColumnName = ColumnValue;
Пример
Вот снимок экрана, показывающий состояние базы данных перед обновлением данных.
Вот снимок казнённого Cassandra Команда Update, которая обновляет запись в таблице Student.
UPDATE University.Student SET name = 'Hayden' WHERE rollno = 1;
После успешного выполнения запроса на обновление в Cassandra «Обновить студента», имя студента будет изменено с «Кларк» на «Хайден», у которого номер 1.
Вот снимок экрана, показывающий состояние базы данных после обновления данных.
Из-за особенностей механизма обновления/вставки (upsert) операция UPDATE по несуществующему первичному ключу создает строку, а не завершается ошибкой.
Cassandra Удалить данные
Команда «Удалить» удаляет всю строку или некоторые столбцы из таблицы «Студент». Когда данные удаляются, они не удаляются из таблицы сразу. Вместо этого удаленные данные помечаются надгробием и удаляются после сжатия.
Синтаксис
DELETE FROM KeyspaceName.TableName WHERE ColumnName1 = ColumnValue;
Приведенные выше Cassandra Синтаксис удаления строки приведет к удалению одной или нескольких строк в зависимости от фильтрации данных в предложенииwhere.
DELETE ColumnName1, ColumnName2 FROM KeyspaceName.TableName WHERE ColumnName1 = ColumnValue;
Приведенный выше синтаксис удалит некоторые столбцы из таблицы.
Пример
Вот снимок, показывающий текущее состояние базы данных перед удалением данных.
Вот снимок команды, которая удалит одну строку из таблицы Student.
DELETE FROM University.Student WHERE rollno = 1;
После успешного выполнения команды CQL Delete из таблицы Student будет удалена одна строка, в которой значение rollno равно 1.
Вот снимок, показывающий состояние базы данных после удаления данных.
Метки "надгробия" сохраняются в течение gc_grace_seconds, по умолчанию — десять дней, поэтому узел, отключенный во время удаления, не сможет восстановить строку после своего возвращения. Таким образом, удаление больших объемов оставляет метки, которые каждое последующее чтение должно будет просканировать.
Что Cassandra не поддерживает
CQL заимствует синтаксис SQL, но не реляционную модель выполнения, поэтому ряд знакомых конструкций ведут себя иначе или отсутствуют.
- CQL не поддерживает объединение таблиц. Связанные данные должны быть денормализованы в одну таблицу во время записи.
- CQL не поддерживает условия OR в предложении WHERE. Используйте IN для одного столбца или выполняйте отдельные запросы.
- CQL не поддерживает UNION или INTERSECT.
- Фильтрация столбцов, не являющихся первичными ключами, невозможна до тех пор, пока по ним не будет создан индекс.
- Сравнения «больше» и «меньше» применяются только к столбцам кластеризации, поскольку на диске сортируются только они.
- Для сопоставления с шаблоном с использованием оператора LIKE требуется индекс SASI, и он недоступен для обычных столбцов.
Одно давнее утверждение нуждается в исправлении. Поддерживаются агрегатные функции: COUNT, MIN, MAX, SUM и AVG прибыл в Cassandra 2.2 и ГРУППА ПО Прибыло в 3.10. Примечание касается скорее масштаба, чем доступности.
SELECT dept, COUNT(*) FROM University.Student WHERE RollNo = 1 GROUP BY dept;
При ограничении одной секцией, как указано выше, агрегирование является эффективным. При же обработке всей таблицы оно превращается в сканирование всего кластера, поэтому... Cassandra остается непригодным для анализа данных в режиме реального времени, и именно поэтому обычно приходится заниматься подготовкой объемных отчетов. Spark или на внешнем складе.
Cassandra Где пункт
In Cassandra, получение данных является деликатным вопросом. Столбец фильтруется по Cassandra путем создания индекса по столбцам, не являющимся первичным ключом.
Синтаксис
SELECT ColumnNames FROM KeyspaceName.TableName WHERE ColumnName1 = Column1Value AND ColumnName2 = Column2Value;
Пример
- Вот снимок, показывающий получение данных из таблицы Студентов без фильтрации данных.
SELECT * FROM University.Student;
Из таблицы Student извлекаются две записи.
- Вот снимок, показывающий получение данных от Student с фильтрацией данных. Получается одна запись.
Данные фильтруются по столбцу «Имя». Извлекаются все записи, у которых имя равно [значение столбца]. Guru99.
SELECT * FROM University.Student WHERE name = 'Guru99';
Правила, определяющие, на какие столбцы может ссылаться предложение WHERE, вытекают непосредственно из первичного ключа.
- ключ раздела Для эффективного выполнения запроса необходимо предоставить полный список данных, поскольку он идентифицирует узел, содержащий данные.
- Clusterстолбцы Затем могут быть введены ограничения, но только в том порядке, в котором они были объявлены. Пропуститьping Один из них отвергнут.
- Сравнения диапазонов допускаются по последнему столбцу кластеризации, на который дана ссылка, а не по предыдущим.
- Все другой столбец необходим вторичный указатель, описанный в создать и удалить индекс учебное пособие.
Когда запрос отклоняется, Cassandra Часто предлагается добавить ALLOW FILTERING. Воспринимайте это как предупреждение, а не как решение проблемы: система сканирует каждый раздел на каждом узле, и изменение схемы почти всегда является правильным ответом.











