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: