SQLite INSERT, UPDATE, SLETT Spørring med eksempel

⚡ Smart oppsummering

SQLite INSERT-, UPDATE- og DELETE-setninger endrer data i en database ved å legge til nye rader, endre eksisterende verdier og fjerne poster, mens ON CONFLICT-klausulen bestemmer hvordan brudd på begrensninger løses under disse operasjonene.

  • 📝 SETT INN: INSERT-setningen legger til én eller flere nye rader, og viser målkolonnene og deres verdier med VALUES-klausulen.
  • ✏️ UPDATE: UPDATE-setningen endrer eksisterende kolonneverdier, og bruker SET for nye data og WHERE for å målrette bestemte rader.
  • 🗑️ SLETT: DELETE-setningen fjerner rader som samsvarer med en WHERE-betingelse, eller alle rader når WHERE-klausulen utelates.
  • ⚠️ Konfliktklausul: ON CONFLICT-klausulen løser brudd på begrensninger gjennom ROLLBACK, ABORT, FAIL, IGNORE eller REPLACE.
  • 🔁 transaksjoner: En databasetransaksjon grupperer flere operasjoner i én enhet som enten fullføres eller fullføres.
  • 🤖 AI-hjelp: AI-tekst-til-SQL-verktøy og GitHub Copilot genererer SQLite INSERT-, UPDATE- og DELETE-setninger fra ledetekster på vanlig engelsk.

SQLite INSERT, OPPDATERING, SLETT forespørsel

Sett inn, oppdater og slett spørring i SQLite

Datamodifikasjonsklausulene i SQLite er INSERT-, UPDATE- og DELETE-setninger. Den brukes til å sette inn nye rader, oppdatere eksisterende verdier eller slette rader fra databasen.

Merk at for alle de følgende eksemplene må du kjøre sqlite3.exe og åpne en tilkobling til eksempeldatabasen som flytende:

Trinn 1) I dette trinnet

  • Åpne Min datamaskin og naviger til følgende katalog «C:\sqlite».
  • Åpne deretter «sqlite3.exe»:

SQLite Spørring - INSERT, OPPDATERING, SLETT

Trinn 2) Åpne databasen «TutorialsSampleDB.db» med følgende kommando:

.open TutorialsSampleDB.db

SQLite Spørring - INSERT, OPPDATERING, SLETT

Nå er du klar til å kjøre alle typer spørringer på databasen.

SQLite INSERT

SQLite INSERT brukes til å sette inn poster i en spesifisert tabell i databasen. du må bruke 'INSERT'-klausulen. Syntaksen for INSERT-leddet er som følger:

SQLite INSERT

  • Etter INSERT-leddet bør du angi hvilken tabell du trenger å sette inn verdiene i.
  • Etter tabellnavnet skriver du listen over kolonner, du vil sette inn verdiene i.
  • Du kan ignorere kolonnenavnet og ikke skrive til dem.
  • Hvis du ikke skriver kolonnenavnet, vil verdiene settes inn i alle kolonnene som finnes i tabellen med samme rekkefølge, kolonnene er definert i tabellen.
  • Etter VALUES-leddet bør du liste verdiene som skal settes inn.
  • Hver INSERT-klausul setter bare inn én rad. Hvis du vil sette inn flere rader, bør du skrive flere INSERT-klausuler, en for hver rad.

SQLite Sett inn eksempel

I følgende eksempel vil vi sette inn 2 rader i elevtabellen, en for hver elev:

INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth)
              VALUES(11, 'Ahmad', 4, '1997-10-12');

INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');

Dette skal kjøres vellykket, og det er ingen utgang for dette:

SQLite innfelt

Dette vil sette inn to studenter:

  • Den første studenten med StudentId=11, StudentName = Ahmad, DepartmentId = 4 og DateOfBirth = 1997-10-12.
  • Den andre studenten med StudentId=12, StudentName = Aly, DepartmentId = 4 og DateOfBirth = 1996-10-12.

I den første setningen listet vi opp kolonnenavnene «StudentId, StudentName, DepartmentId, DateOfBirth». I den andre setningen gjorde vi imidlertid ikke det.

De fire verdiene «12, 'Aly', 4, '1996-10-12'» vil bli satt inn i alle de fire kolonnene i Student-tabellen i samme rekkefølge som kolonnene er definert.

La oss nå bekrefte at de to studentene ble satt inn i Studenter-tabellen ved å kjøre følgende spørring:

SELECT * FROM Students;

Da bør du se de to studentene som ble returnert fra den spørringen som følger:

SQLite innfelt

SQLite Oppdater

SQLite UPDATE Query brukes til å endre de eksisterende postene i en tabell. Du kan bruke WHERE-klausulen med UPDATE-spørringen for å oppdatere valgte rader. UPDATE-leddet oppdaterer en tabell ved å endre en verdi for en bestemt kolonne. Følgende er syntaksen til UPDATE-klausulen:

SQLite Oppdater

Som følgende:

  • Etter "oppdateringsklausulen" bør du skrive tabellnavnet for å oppdatere.
  • Du må skrive "SET-klausul" som brukes til å skrive kolonnenavnet som skal oppdateres og verdien som skal oppdateres.
  • Du kan oppdatere mer enn én kolonne. Du kan bruke komma mellom hver linje.
  • Du kan spesifisere en WHERE-klausul for å spesifisere bare noen rader. Bare radene som uttrykket evaluerer til sanne, oppdateres. Hvis du ikke spesifiserte en WHERE-klausul, vil alle radene bli oppdatert.

SQLite Oppdateringseksempel

I den følgende UPDATE-setningen vil vi oppdatere avdelings-IDen for studenten med StudentId = 6 til 3:

UPDATE Students
SET DepartmentId = 3 
WHERE StudentId = 6;

Dette skal kjøre vellykket, og du skal ikke få noe utdata:

SQLite Oppdater

I UPDATE-klausulen spesifiserte vi at vi ønsker å oppdatere tabellen Studenter.

  • I WHERE-leddet filtrerte vi alle elevene for å velge bare raden for StudentId = 6.
  • SET-klausulen vil oppdatere verdien av avdelings-ID for de valgte studentene til 3.

La oss nå verifisere at studenten med ID 6 er oppdatert, ved å kjøre følgende kommando:

SELECT * FROM Students WHERE StudentId = 6;

Du skal nå se at avdelings-ID-verdien nå er 3 som følger:

SQLite Oppdater

SQLite Delete

SQLite DELETE-spørringen brukes til å fjerne eksisterende poster fra en spesifisert tabell. Du kan bruke WHERE-leddet med DELETE-spørringer for å slette de valgte radene.

DELETE-leddet har følgende syntaks:

SQLite Delete

  • Du må skrive et tabellnavn etter DELETE FROM-klausulen som du vil slette poster fra. (Merk: DELETE-klausulen brukes til å slette noen poster fra en tabell eller slette alle postene, og den vil ikke slette selve tabellen. DROP-klausulen brukes imidlertid til å slette hele tabellen med alle postene i den.)
  • Hvis du skriver DELETE-klausulen slik "DELETE FROM guru", vil dette slette alle postene fra tabellen "guru".
  • Du kan spesifisere en WHERE-betingelse med et uttrykk hvis du vil slette noen spesifikke rader. Bare radene som uttrykket evaluerer til sant vil bli slettet. For eksempel, "DELETE FROM guru WHERE id > 5" - dette vil slette bare postene som har id større enn 5.

Eksempel

I følgende uttalelse vil vi slette to studenter med StudentId 11 og 12:

DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;

Uttrykket «StudentId = 11 ELLER StudentId = 12» vil bare være sant for studenter med ID-ene 11 og 12. Så DELETE-klausulen vil bli brukt på begge og vil bare slette dem.

Denne kommandoen skal kjøre vellykket, og du skal ikke få noen utdata som følger:

SQLite Delete

Du kan bekrefte at de to studentene ble slettet ved å velge alle postene fra Elev-tabellen som følger:

SELECT * FROM Students;

Du bør ikke se de to elevene med ID 11 og 12 som følger:

SQLite Delete

SQLite Konfliktklausul

Anta at du har en kolonne som har en av følgende kolonnebegrensninger: UNIQUE, NOT NULL, CHECK eller PRIMARY KEY. Og så prøvde du å sette inn eller oppdatere en verdi på den kolonnen med en verdi som er i konflikt med denne begrensningen.

For eksempel, hvis en kolonne har en UNIQUE-begrensning og du prøvde å sette inn en verdi som allerede eksisterer (en duplikatverdi), som er i konflikt med UNIQUE-begrensningen. Deretter lar KONFLIKT-klausulen deg velge hva du skal gjøre i slike tilfeller for å løse denne konflikten.

Før vi fortsetter å forklare hvordan KONFLIKT-klausulen løser konflikten. Du bør forstå hva en databasetransaksjon er.

Databasetransaksjon

Begrepet databasetransaksjon er en liste over SQLite operasjoner (sett inn eller oppdater eller slett). Databasetransaksjonen må utføres som én enhet, enten alle operasjonene er utført vellykket eller ikke i det hele tatt. Alle operasjoner vil bli kansellert hvis en av dem ikke ble utført.

Eksempel på en databasetransaksjon

Transaksjonen for å overføre penger fra en bankkonto til en annen vil involvere et par aktiviteter. Denne transaksjonsoperasjonen inkluderer uttak av penger fra den første kontoen og innskudd på en annen konto. Denne transaksjonen må fullføres eller kanselleres fullstendig og ikke mislykkes halvveis.

Her er listen over fem oppløsninger du kan velge i KONFLIKT-klausulen:

  1. ROLLBACK – dette vil rulle tilbake transaksjonen der den gjeldende SQLite uttalelsen som har konflikten (den vil kansellere hele transaksjonen). For eksempel, hvis du prøver å oppdatere 10 rader, og den femte raden har en verdi som er i konflikt med en begrensning, vil ingen rader bli oppdatert, de 10 radene forblir de samme. En feil vil bli kastet.
  2. AVBRYT – dette vil avbryte (avbryte) gjeldende SQLite kun erklæringen som har konflikten, og transaksjonen vil ikke bli kansellert. For eksempel, hvis du prøver å oppdatere 10 rader, og den femte raden har en verdi som er i konflikt med en begrensning, vil bare den femte verdien ikke bli oppdatert, men de andre 9 radene vil bli oppdatert. En feil vil bli kastet.
  3. FAIL – avbryter gjeldende SQLite uttalelse som har konflikten. Transaksjonen vil imidlertid ikke fortsette, men de tidligere endringene som er gjort i rader før raden som har konflikten, vil bli utført. For eksempel, hvis du prøver å oppdatere 10 rader, og den femte raden har en verdi som er i konflikt med en begrensning, vil bare de 4 radene bli oppdatert og den andre ikke. En feil vil bli kastet.
  4. IGNORER – dette vil hoppe over raden som inneholder begrensningsbruddet og fortsette behandlingen av de andre påfølgende radene i SQLite uttalelse. For eksempel, hvis du prøver å oppdatere 10 rader, og den femte raden har en verdi som er i konflikt med en begrensning, vil bare de 4 radene bli oppdatert og den andre ikke. Det vil ikke fortsette å oppdatere andre rader og stoppe ved raden som har konfliktverdien. Ingen feil vil bli kastet.
  5. ERSTATT – det avhenger av hvilken type begrensning som har bruddet:
    • Når det er et begrensningsbrudd for UNIQUE eller PRIMÆR NØKKEL-begrensningen. REPLACE vil erstatte raden som forårsaker bruddet med den nye innsatte eller oppdaterte raden.
    • Når det er et NOT NULL-begrensningsbrudd, vil REPLACE-leddet erstatte NULL-verdien med standardverdien for den kolonnen. Hvis kolonnen ikke har en standardverdi, da SQLite vil avbryte erklæringen (erklæringen vil bli kansellert)
    • HVIS bruddet på CHECK-begrensningen oppstår, vil klausulen bli avbrutt.

Merk: De fem løsningene ovenfor er alternativer for hvordan du ønsker å løse konflikten. Det er ikke nødvendigvis slik at det som gjelder for å løse én konflikt, også gjelder for å løse andre typer konflikter.

Hvordan erklære KONFLIKT-klausulen

Du kan erklære ON CONFLICT-leddet når du definerer en begrensning for en kolonnedefinisjon i CREATE TABLE-leddet. Bruker følgende syntaks:

SQLite Konfliktklausul

Du kan velge en av de fem løsningene for å løse konflikten som forklart tidligere.

PÅ KONFLIKT IGNORER Eksempel

Trinn 1) Opprett et nytt tabellemne som følger:

CREATE TABLE [Subjects] (  
    [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE,
    [SubjectName] NVARCHAR NOT NULL
);

Legg merke til at vi har definert en PRIMARY KEY-begrensning på SubjectId-kolonnen. Primærnøkkelbegrensningen tillater ikke at to dupliserte verdier settes inn i SubjectId-kolonnen, slik at alle verdiene i den kolonnen skal være unike. Legg også merke til at vi velger en konfliktløsning som «IGNORE».

Kommandoen skal kjøre vellykket, og du skal ikke få noen feil:

PÅ KONFLIKT IGNORER Eksempel

Trinn 2) La oss nå sette inn noen verdier i de nye tabellemnene, men med en verdi som bryter med primærnøkkelbegrensningen:

INSERT INTO Subjects VALUES(1, 'Algebra');
INSERT INTO Subjects VALUES(2, 'Database Course');
INSERT INTO Subjects VALUES(2, 'Data Structures');
INSERT INTO Subjects VALUES(4, 'Algorithms');

I denne INSERT-setningen prøvde vi å sette inn to kurs med samme primærnøkkelemne-id 2, som er et brudd på primærnøkkelbegrensningen.

Kommandoene skal kjøre fint, og du skal ikke få noen feil. Som følgende:

PÅ KONFLIKT IGNORER Eksempel

Trinn 3) Velg alle emnene fra tabellen som følger:

SELECT * FROM Subjects;

Dette vil gi deg listen over emner:

PÅ KONFLIKT IGNORER Eksempel

Legg merke til at bare tre emner ble satt inn «Algebra, databasekurs og Algorithms” i stedet for 4 rader.

Raden som har verdien som bryter primærnøkkelbegrensningen, som er "Datastrukturer", ble ignorert og ikke satt inn. Imidlertid SQLite fortsetter å kjøre andre setninger etter den raden.

Trinn 4) SLETT tabellemnene for å lage den igjen med en annen ON CONFLICT-klausul for følgende eksempel ved å kjøre følgende kommando:

DROP TABLE Subjects;

Drop-kommandoen sletter hele tabellen. Tabellemner eksisterer nå ikke.

PÅ KONFLIKT ERSTATT Eksempel

Trinn 1) Opprett et nytt tabellemne som følger:

CREATE TABLE [Subjects] (  
    [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE,
    [SubjectName] NVARCHAR NOT NULL
);

Legg merke til at vi definerte en PRIMÆR NØKKEL-begrensning på SubjectId-kolonnen. Primærnøkkelbegrensningen tillater ikke at to dupliserte verdier settes inn i SubjectId-kolonnen slik at alle verdiene i den kolonnen skal være unike.

Legg også merke til at vi velger «ERSTATT» som konfliktløsningsalternativ. Kommandoen skal kjøre uten problemer, og du skal ikke få noen feilmeldinger:

PÅ KONFLIKT ERSTATT Eksempel

Trinn 2) La oss nå sette inn noen verdier i den nye tabellen Emner, men med en verdi som bryter med primærnøkkelbegrensningen:

INSERT INTO Subjects VALUES(1, 'Algebra');
INSERT INTO Subjects VALUES(2, 'Database Course');
INSERT INTO Subjects VALUES(2, 'Data Structures');
INSERT INTO Subjects VALUES(4, 'Algorithms');

I denne INSERT-setningen prøvde vi å sette inn to kurs med samme primærnøkkelemne-id 2, som er et brudd på primærnøkkelbegrensningen.

Kommandoene skal kjøre fint, og du skal ikke få noen feil. Som følgende:

PÅ KONFLIKT ERSTATT Eksempel

Trinn 3) Velg alle emnene fra tabellen som følger:

SELECT * FROM Subjects;

Dette vil gi deg listen over emner:

PÅ KONFLIKT ERSTATT Eksempel

Legg merke til at bare tre emner ble satt inn «Algebra, datastrukturer og Algorithms” mens vi prøvde å sette inn 4 rader.

Raden som har verdien som bryter med primærnøkkelbegrensningen, som er «Datastrukturer», erstattet verdien «Databasekurs» som følger:

  • De to første insert-setningene fungerer fint uten problemer. To emner Algebra og Databasekurs vil bli satt inn med id 1, 2.
  • Når SQLite prøver å kjøre den tredje insert-setningen med SubjectId 2 og SubjectName «Data Structures», og den finner ut at det allerede finnes et subjekt med SubjectId = 2. Dette er et brudd på primærnøkkelbegrensningen som er definert i SubjectId-kolonnen.
  • SQLite vil velge en REPLACE-løsning for denne konflikten. Den erstatter verdien som allerede finnes i emnetabellen med den nye verdien fra insert-setningen. Dermed vil emnenavnet i «Databasekurs» bli erstattet med emnenavnet i «Datastrukturer».

Spørsmål og svar

UPSERT kombinerer innsetting og oppdatering. Siden SQLite 3.24.0 (2018), INSERT INTO … ON CONFLICT(kolonne) DO UPDATE SET … setter inn en ny rad, eller oppdaterer den eksisterende når det oppstår en UNIQUE- eller PRIMARY KEY-konflikt. DO NOTHING hopper i stedet over raden stille.

INNSETT ELLER ERSTATT sletter den konfliktfylte raden og setter inn en ny, slik at ikke-oppførte kolonner tilbakestilles til standardverdiene. VED KONFLIKT redigerer UPDATE den eksisterende raden på plass, beholdping andre kolonner intakte, noe som gjør den til den tryggere, sanne oppsvinget.

List opp flere verdigrupper etter VERDIER, atskilt med komma: INSERT INTO Students (id, navn) VERDIER (1,'A'), (2,'B'), (3,'C');. Dette flerradsskjemaet fungerer siden SQLite 3.7.11 og er raskere enn å kjøre én INSERT-setning per rad.

Kjør DELETE FROM tabellnavn; uten en WHERE-klausul. SQLite har ingen TRUNCATE-kommando, men den bruker en avkortingsoptimalisering som fjerner alle rader samtidig. Tabellstrukturen forblir; bruk DROP TABLE for å fjerne tabellen helt.

Siden SQLite 3.35.0 (2021), INSERT, UPDATE og DELETE godtar en valgfri RETURNING-klausul som sender ut de berørte radene. For eksempel returnerer INSERT … RETURNING id; genererte verdier umiddelbart, og unngår en separat SELECT for å lese hva som er endret.

Bruk SETT INN I … VELG: SETT INN I Archive (id, navn) SELECT id, navn FROM Studenter WHERE Avdelings-ID = 4;. SQLite setter inn hver rad SELECT returnerer, slik at kolonnerekkefølgen og antallet må samsvare med måltabellen.

Ja. AI-tekst-til-SQL-assistenter konverterer forespørsler på vanlig engelsk til SQLite INSERT-, UPDATE- og DELETE-setninger, inkludert WHERE- og ON CONFLICT-klausuler. Å oppgi tabell- og kolonnenavn forbedrer nøyaktigheten, og alle genererte setninger bør gjennomgås og testes før de kjøres på reelle data.

GitHub Copilot antyder SQLite INNSETT-, UPDATE- og DELETE-spørringer innebygd i redigeringsprogrammer som VS CodeDen leser skjemaer og kommentarer i nærheten, slik at fullføringer gjenbruker de virkelige tabell- og kolonnenavnene dine, men du bør fortsatt bekrefte hver setning før du kjører den.

Oppsummer dette innlegget med: