Cassandra Query Language (CQL): Sett inn, oppdater og slett

⚡ Smart oppsummering

Cassandra Query Language håndterer insert-, update-, delete- og read-operasjoner med en syntaks som ligner på SQL, men med annen semantikk under. Denne siden dekker hver setning, upsert-oppførselen som slår sammen insert og update, og de virkelige begrensningene til WHERE-klausulen.

  • Innsettingsadferd: Bare primærnøkkelen er obligatorisk, og utelatte kolonner bruker ingen lagringsplass.
  • 🔄 Oppgrader semantikk: Sett inn og oppdatering er samme operasjon, så skriving av en eksisterende nøkkel overskriver den stille.
  • 🗑️ Slett kostnad: Fjernede rader blir gravsteiner og forsvinner først etter komprimeringskjøringer.
  • 🔍 Hvor klausulen begrenser: Filtrering fungerer på primærnøkkelkolonner, eller på andre kolonner når en indeks finnes.
  • 📊 Samlet støtte: ANTALL, MIN, MAKS, SUM AVG og GROUP BY støttes, men bare effektivt innenfor én partisjon.
  • 🚫 Fortsatt ikke støttet: Sammenføyninger, OR-betingelser og analyser på tvers av partisjoner forblir utenfor CQL per design.

Cassandra CQL Sett inn Oppdater Slett

Sett inn data

Ocuco Cassandra insert statement skriver data inn Cassandra kolonner i radform. Cassandra insert query vil lagre bare de kolonnene som er gitt av brukeren. Du må nødvendigvis spesifisere bare primærnøkkelkolonnen.

Det vil ikke ta plass for ikke gitte verdier. Ingen resultater returneres etter innsetting.

syntax

INSERT INTO KeyspaceName.TableName (ColumnName1, ColumnName2, ColumnName3)
VALUES (Column1Value, Column2Value, Column3Value);

Eksempel

Her er øyeblikksbildet av de henrettede Cassandra Sett inn i tabellspørring som vil sette inn én post Cassandra tabellen 'Student'.

Sett inn data

INSERT INTO University.Student (RollNo, Name, dept, Semester)
VALUES (2, 'Michael', 'CS', 2);

Etter vellykket utførelse av kommandoen Sett inn i Cassandra, vil én rad settes inn i Cassandra tabell Student med RollNo 2, Navn Michael, avd CS og Semester 2.

Her er øyeblikksbildet av gjeldende databasetilstand.

Sett inn data

Upsert Data

Cassandra opprører. Upsert betyr det Cassandra vil sette inn en rad hvis en primærnøkkel ikke allerede eksisterer, ellers hvis primærnøkkelen allerede eksisterer, vil den oppdatere den raden.

Dette har en praktisk konsekvens som er verdt å si tydelig: en INSERT rapporterer aldri en duplikatnøkkelfeil, så en utilsiktet ny innsetting overskriver den eksisterende raden uten forvarsel. Når dette må forhindres, legg til IF NOT EXISTS for å gjøre setningen til en lettvektstransaksjon.

INSERT INTO University.Student (RollNo, Name)
VALUES (2, 'Michael') IF NOT EXISTS;

Lette transaksjoner bruker en konsensusrunde på tvers av replikaer, så de er betydelig tregere enn en vanlig skriving og bør reserveres for tilfeller som virkelig trenger sjekken.

Oppdater data

Ocuco Cassandra Oppdateringsspørring brukes til å oppdatere dataene i Cassandra bord. Hvis ingen resultater returneres etter oppdatering av data, betyr det at data er vellykket oppdatert, ellers vil en feil returneres. Kolonneverdier endres i 'Set'-leddet mens data filtreres med 'Where'-leddet.

syntax

UPDATE KeyspaceName.TableName
SET ColumnName1 = NewValue1,
    ColumnName2 = NewValue2
WHERE ColumnName = ColumnValue;

Eksempel

Her er skjermbildet som viser databasetilstanden før du oppdaterer data.

Oppdater data

Her er øyeblikksbildet av de henrettede Cassandra Oppdateringskommando som oppdaterer posten i elevtabellen.

Oppdater data

UPDATE University.Student
SET name = 'Hayden'
WHERE rollno = 1;

Etter vellykket utførelse av oppdateringsspørringen i Cassandra 'Oppdater student', studentnavn vil bli endret fra 'Clark' til 'Hayden' som har rollno 1.

Her er skjermbildet som viser databasetilstanden etter oppdatering av data.

Oppdater data

På grunn av upsert-oppførsel oppretter en UPDATE mot en primærnøkkel som ikke finnes raden i stedet for å mislykkes.

Cassandra Slett data

Kommandoen 'Slett' fjerner en hel rad eller noen kolonner fra tabellen Student. Når data slettes, slettes de ikke umiddelbart fra tabellen. I stedet merkes slettede data med en gravstein og fjernes etter komprimering.

syntax

DELETE FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Ovennevnte Cassandra slette radsyntaks vil slette én eller flere rader avhengig av datafiltrering i where-klausulen.

DELETE ColumnName1, ColumnName2 FROM KeyspaceName.TableName
WHERE ColumnName1 = ColumnValue;

Syntaksen ovenfor vil slette noen kolonner fra tabellen.

Eksempel

Her er øyeblikksbildet som viser gjeldende databasestatus før du sletter data.

Cassandra Slett data

Her er øyeblikksbildet av kommandoen som vil fjerne én rad fra tabellen Student.

Cassandra Slett data

DELETE FROM University.Student WHERE rollno = 1;

Etter vellykket utførelse av CQL Delete-kommandoen, vil én rad bli slettet fra tabellen Student der rollno-verdien er 1.

Her er øyeblikksbildet som viser databasetilstanden etter sletting av data.

Cassandra Slett data

Gravsteiner overlever i gc_grace_seconds, ti dager som standard, slik at en node som er offline under slettingen ikke kan gjenopplive raden når den returnerer. Sletting av store volumer etterlater derfor markører som hver påfølgende lesning må skanne forbi.

Hva Cassandra støtter ikke

CQL låner SQL-syntaks, men ikke den relasjonelle utførelsesmodellen, så flere kjente konstruksjoner oppfører seg annerledes eller er fraværende.

  1. CQL støtter ikke koblinger mellom tabeller. Relaterte data må denormaliseres til én tabell ved skriving.
  2. CQL støtter ikke OR-betingelser i en WHERE-klausul. Bruk IN på én kolonne, eller kjør separate spørringer.
  3. CQL støtter ikke UNION eller INTERSECT.
  4. Kolonner som ikke er primærnøkkelkolonner kan ikke filtreres før det finnes en indeks på dem.
  5. Sammenligninger av større enn og mindre enn gjelder bare for klyngekolonner, fordi bare de sorteres på disken.
  6. Mønstersamsvar med LIKE krever en SASI-indeks og er ikke tilgjengelig på vanlige kolonner.

Én langvarig påstand må korrigeres. Aggregerte funksjoner støttes: ANTALL, MIN, MAKS, SUM og AVG ankom i Cassandra 2.2, og GRUPPE AV kom i 3.10. Forbeholdet er omfang snarere enn tilgjengelighet.

SELECT dept, COUNT(*) FROM University.Student
WHERE RollNo = 1 GROUP BY dept;

Begrenset til en enkelt partisjon som ovenfor, er et aggregat effektivt. Kjøres det over hele tabellen, blir det en klyngeomfattende skanning, og det er derfor Cassandra fortsatt uegnet for ad hoc-analyse, og hvorfor tung rapportering vanligvis presses til Spark eller et eksternt lager.

Cassandra Hvor klausul

In Cassandra, er datainnhenting et sensitivt problem. Kolonnen filtreres inn Cassandra ved å lage en indeks på ikke-primære nøkkelkolonner.

syntax

SELECT ColumnNames FROM KeyspaceName.TableName
WHERE ColumnName1 = Column1Value
  AND ColumnName2 = Column2Value;

Eksempel

  • Her er øyeblikksbildet som viser datahentingen fra Studenttabellen uten datafiltrering.

Cassandra Hvor klausul

SELECT * FROM University.Student;

To poster hentes fra Studenttabell.

  • Her er øyeblikksbildet som viser datahentingen fra Student med datafiltrering. Én post hentes.

Data filtreres etter navnekolonne. Alle poster som har navn lik Guru99.

Cassandra Hvor klausul

SELECT * FROM University.Student WHERE name = 'Guru99';

Reglene som styrer hvilke kolonner en WHERE-klausul kan referere til, følger direkte fra primærnøkkelen.

  • Ocuco partisjonsnøkkel må oppgis i sin helhet for enhver effektiv spørring, fordi den identifiserer noden som inneholder dataene.
  • Clusterkolonner kan da begrenses, men bare i den rekkefølgen de ble erklært. Hopp overping én blir avvist.
  • Rekkeviddesammenligninger er tillatt på den siste klyngekolonnen det refereres til, ikke på tidligere.
  • Noen annen kolonne trenger en sekundærindeks, dekket i opprette og slette indeks opplæringen.

Når en forespørsel blir avvist, Cassandra foreslår ofte å legge til ALLOW FILTERING. Betrakt det som en advarsel snarere enn en løsning: den skanner hver partisjon på hver node, og en skjemaendring er nesten alltid den riktige responsen.

Spørsmål og svar

En batch grupperer setninger slik at de lykkes eller mislykkes sammen. Bruk den til å holde dupliserte tabeller i trinn, ikke for masselasting, der en batch på tvers av mange partisjoner bremser koordinatoren betraktelig.

Sjåfører søker automatisk ved hjelp av et paging-tilstandstoken. I cqlsh angir PAGING størrelsen. Unngå å emulere OFFSET med en teller, fordi Cassandra har ingen effektiv radhoppingping mekanisme.

Hvis en replika var nede lenger enn gc_grace_seconds og gravsteinen allerede var komprimert bort, holder replikaen fortsatt den gamle raden og sprer den tilbake. Regelmessig reparasjon forhindrer dette.

Enkle enkelttabellvalg konverterer bra. Alt med en join, OR eller delspørring har ingen direkte CQL-ekvivalent, og AI dekker ofte gapet med ALLOW FILTERING, som ikke er en løsning.

Ja. Limer inn TRACING ON-utdata gir vanligvis en tydelig avlesning av tombstone-skanninger, brede partisjoner eller hopp på tvers av noder. Bekreft den foreslåtte skjemaendringen på en kopi før du bruker den.

Oppsummer dette innlegget med: