Cassandra Limbaj de interogare (CQL): Inserare, actualizare și ștergere
⚡ Rezumat inteligent
Cassandra Limbajul de interogare gestionează operațiunile de inserare, actualizare, ștergere și citire cu o sintaxă apropiată de SQL, dar cu o semantică diferită. Această pagină prezintă fiecare instrucțiune, comportamentul upsert care îmbină inserarea și actualizarea și limitele reale ale clauzei WHERE.

Introduceți date
Cassandra instrucțiunea insert scrie datele în Cassandra coloane sub formă de rând. Cassandra interogarea de inserare va stoca numai acele coloane care sunt date de utilizator. Trebuie să specificați în mod necesar doar coloana cheii primare.
Nu va ocupa spațiu pentru valori nedate. Nu se returnează niciun rezultat după inserare.
Sintaxă
INSERT INTO KeyspaceName.TableName (ColumnName1, ColumnName2, ColumnName3) VALUES (Column1Value, Column2Value, Column3Value);
Exemplu
Iată instantaneul celui executat Cassandra Interogarea de inserare în tabel care va insera o înregistrare Cassandra tabelul „Student”.
INSERT INTO University.Student (RollNo, Name, dept, Semester) VALUES (2, 'Michael', 'CS', 2);
După executarea cu succes a comenzii Insert into Cassandra, un rând va fi inserat în Cassandra Tabel Student cu rola nr. 2, Nume Michael, dept CS și semestrul 2.
Iată un instantaneu al stării curente a bazei de date.
Upsert Date
Cassandra se supără. Upsert înseamnă că Cassandra va insera un rând dacă o cheie primară nu există deja; altfel, dacă o cheie primară există deja, va actualiza acel rând.
Aceasta are o consecință practică care merită enunțată clar: o instrucțiune INSERT nu raportează niciodată o eroare de cheie duplicată, așa că o reinserție accidentală suprascrie rândul existent fără avertisment. Când acest lucru trebuie prevenit, adăugați IF NOT EXISTS pentru a face din instrucțiune o tranzacție ușoară.
INSERT INTO University.Student (RollNo, Name) VALUES (2, 'Michael') IF NOT EXISTS;
Tranzacțiile ușoare utilizează o rundă de consens între replici, deci sunt considerabil mai lente decât o scriere normală și ar trebui rezervate pentru cazurile care necesită cu adevărat verificarea.
Actualizați datele
Cassandra Interogarea de actualizare este utilizată pentru a actualiza datele din Cassandra tabel. Dacă nu se returnează niciun rezultat după actualizarea datelor, înseamnă că datele sunt actualizate cu succes, altfel va fi returnată o eroare. Valorile coloanelor sunt modificate în clauza „Set” în timp ce datele sunt filtrate cu clauza „Unde”.
Sintaxă
UPDATE KeyspaceName.TableName SET ColumnName1 = NewValue1, ColumnName2 = NewValue2 WHERE ColumnName = ColumnValue;
Exemplu
Iată o captură de ecran care arată starea bazei de date înainte de actualizarea datelor.
Iată instantaneul celui executat Cassandra Comanda de actualizare care actualizează înregistrarea din tabelul Student.
UPDATE University.Student SET name = 'Hayden' WHERE rollno = 1;
După executarea cu succes a interogării de actualizare în Cassandra „Actualizați student”, numele studentului va fi schimbat din „Clark” în „Hayden” care are numărul 1.
Iată o captură de ecran care arată starea bazei de date după actualizarea datelor.
Din cauza comportamentului upsert, o UPDATE pentru o cheie primară care nu există creează rândul în loc să eșueze.
Cassandra Ștergeți datele
Comanda „Șterge” elimină un rând întreg sau unele coloane din tabel Student. Când datele sunt șterse, acestea nu sunt șterse imediat din tabel. În schimb, datele șterse sunt marcate cu o piatră funerară și sunt eliminate după compactare.
Sintaxă
DELETE FROM KeyspaceName.TableName WHERE ColumnName1 = ColumnValue;
Cele de mai sus Cassandra sintaxa de ștergere a rândului va șterge unul sau mai multe rânduri în funcție de filtrarea datelor în clauza where.
DELETE ColumnName1, ColumnName2 FROM KeyspaceName.TableName WHERE ColumnName1 = ColumnValue;
Sintaxa de mai sus va șterge unele coloane din tabel.
Exemplu
Iată instantaneul care arată starea curentă a bazei de date înainte de ștergerea datelor.
Iată instantaneul comenzii care va elimina un rând din tabel Student.
DELETE FROM University.Student WHERE rollno = 1;
După executarea cu succes a comenzii CQL Delete, un rând va fi șters din tabelul Student, unde valoarea rollno este 1.
Iată instantaneul care arată starea bazei de date după ștergerea datelor.
Pietrele tombale supraviețuiesc timp de gc_grace_seconds, zece zile în mod implicit, astfel încât un nod offline în timpul ștergerii nu poate reactiva rândul când acesta revine. Prin urmare, ștergerea volumelor mari lasă markeri pe lângă care fiecare citire ulterioară trebuie să scaneze.
Ce Cassandra nu sustine
CQL împrumută sintaxa SQL, dar nu și modelul de execuție relațională, astfel încât mai multe construcții familiare se comportă diferit sau lipsesc.
- CQL nu acceptă joncțiuni între tabele. Datele corelate trebuie denormalizate într-un singur tabel la momentul scrierii.
- CQL nu acceptă condiții OR într-o clauză WHERE. Folosiți IN pe o singură coloană sau rulați interogări separate.
- CQL nu acceptă UNION sau INTERSECT.
- Coloanele care nu sunt cheie primară nu pot fi filtrate până când nu există un index pe ele.
- Comparațiile mai mare decât și mai mic decât se aplică numai coloanelor de grupare, deoarece doar acestea sunt sortate pe disc.
- Potrivirea de șabloane cu LIKE necesită un index SASI și nu este disponibilă pe coloanele obișnuite.
O afirmație veche necesită corectare. Funcțiile agregate sunt acceptate: NUMĂRARE, MIN, MAX, SUMĂ și AVG a sosit in Cassandra 2.2 și A SE GRUPA CU a sosit în versiunea 3.10. Avertismentul este domeniul de aplicare, nu disponibilitatea.
SELECT dept, COUNT(*) FROM University.Student WHERE RollNo = 1 GROUP BY dept;
Limitat la o singură partiție, așa cum este menționat mai sus, un agregat este eficient. Dacă este rulat pe întreaga tabelă, devine o scanare la nivelul întregului cluster, motiv pentru care Cassandra rămâne nepotrivit pentru analize ad-hoc și de ce raportarea complexă este în mod normal împinsă la Spark sau un depozit extern.
Cassandra Unde este Clauza?
In Cassandra, recuperarea datelor este o problemă sensibilă. Coloana este filtrată Cassandra prin crearea unui index pe coloanele cheie non-primare.
Sintaxă
SELECT ColumnNames FROM KeyspaceName.TableName WHERE ColumnName1 = Column1Value AND ColumnName2 = Column2Value;
Exemplu
- Iată instantaneul care arată preluarea datelor din tabelul Student fără filtrarea datelor.
SELECT * FROM University.Student;
Două înregistrări sunt preluate din tabelul Student.
- Iată instantaneul care arată preluarea datelor de la Student cu filtrarea datelor. O înregistrare este preluată.
Datele sunt filtrate după coloana cu nume. Sunt preluate toate înregistrările care au numele egal cu Guru99.
SELECT * FROM University.Student WHERE name = 'Guru99';
Regulile care guvernează la ce coloane poate face referire o clauză WHERE decurg direct din cheia primară.
- cheie de partiție trebuie furnizat în întregime pentru orice interogare eficientă, deoarece identifică nodul care deține datele.
- Clustering coloane pot fi apoi restricționate, dar numai în ordinea în care au fost declarate. Sari pesteping unul este respins.
- Comparațiile de intervale sunt permise pe ultima coloană de grupare la care se face referire, nu pe cele anterioare.
- Orice altă coloană are nevoie de un index secundar, acoperit de crearea și eliminarea indexului tutorial.
Când o interogare este respinsă, Cassandra sugerează adesea adăugarea comenzii ALLOW FILTERING. Tratați acest lucru ca pe un avertisment, mai degrabă decât ca pe o soluție: scanează fiecare partiție de pe fiecare nod, iar o modificare a schemei este aproape întotdeauna răspunsul corect.










