SQLite Visningar, index och trigger med exempel

โšก Smart sammanfattning

SQLite vyer, index och triggers รคr administrativa verktyg som gรถr det enklare att frรฅga efter och underhรฅlla en databas: vyer รฅteranvรคnder komplexa frรฅgor, index accelererar sรถkningar och triggers kรถr fรถrdefinierade รฅtgรคrder automatiskt nรคr data รคndras.

  • ๐Ÿ‘๏ธ Visningar: En vy รคr en logisk tabell som byggs utifrรฅn ett SELECT-uttryck, vilket lรฅter dig รฅteranvรคnda komplexa frรฅgor utan att skriva om dem.
  • โณ Tillfรคlliga vyer: Tillfรคlliga vyer finns bara fรถr den aktuella anslutningen och raderas automatiskt nรคr anslutningen stรคngs.
  • โšก Index: Index fungerar som ett bokregister, vilket gรถr att SQLite hitta matchande rader snabbt istรคllet fรถr att skanna varje rad i tabellen.
  • ๐ŸŽฏ Indextyper: SQLite stรถder uttrycks-, partiella och unika index fรถr att finjustera prestanda fรถr specifika frรฅgemรถnster.
  • ๐Ÿ”” triggers: Triggers kรถr fรถrdefinierade operationer automatiskt fรถre eller efter INSERT-, UPDATE- eller DELETE-satser i en tabell.
  • ๐Ÿค– AI-hjรคlp: AI text-till-SQL-verktyg och GitHub Copilot genererar SQLite vyer, index och utlรถsare frรฅn prompter pรฅ vanligt engelska.

SQLite Utlรถsare, visningar och index

I den dagliga anvรคndningen av SQLite, behรถver du nรฅgra administrativa verktyg รถver din databas. Du kan ocksรฅ anvรคnda dem fรถr att gรถra sรถkningar i databasen mer effektivt genom att skapa index, eller mer รฅteranvรคndbara genom att skapa vyer.

SQLite Visa

Vyerna pรฅminner mycket om tabeller. Men vyer รคr logiska tabeller; de lagras inte fysiskt som bord. En vy bestรฅr av ett urvalsuttryck.

Du kan definiera en vy fรถr dina komplexa frรฅgor, och du kan รฅteranvรคnda dessa frรฅgor nรคr du vill genom att anropa vyn direkt istรคllet fรถr att skriva om frรฅgorna igen.

CREATE VIEW uttalande

Fรถr att skapa en vy pรฅ en databas kan du anvรคnda CREATE VIEW-satsen fรถljt av vynamnet och sedan sรคtta den frรฅga du vill ha efter det.

Exempel: I fรถljande exempel skapar vi en vy med namnet "AllStudentsView" i exempeldatabasen "TutorialsSampleDB.db" enligt fรถljande:

Steg 1) ร–ppna Den hรคr datorn och navigera till fรถljande katalog "C:\sqlite" och รถppna sedan "sqlite3.exe":

SQLite Visa

Steg 2) ร–ppna databasen "TutorialsSampleDB.db" med fรถljande kommando:

SQLite Visa

Steg 3) Fรถljande รคr en grundlรคggande syntax fรถr kommandot sqlite3 fรถr att skapa vyn

CREATE VIEW AllStudentsView
AS
  SELECT 
    s.StudentId,
    s.StudentName,
    s.DateOfBirth,
    d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

Det ska inte finnas nรฅgon utdata frรฅn kommandot sรฅ hรคr:

SQLite Visa

Steg 4) Fรถr att sรคkerstรคlla att vyn skapas kan du vรคlja listan med vyer i databasen genom att kรถra fรถljande kommando:

SELECT name FROM sqlite_master WHERE type = 'view';

Du bรถr se att vyn "AllStudentsView" returneras:

SQLite Visa

Steg 5) Nu รคr vรฅr vy skapad, du kan anvรคnda den som en vanlig tabell ungefรคr sรฅ hรคr:

SELECT * FROM AllStudentsView;

Detta kommando kommer att frรฅga vyn "AllStudents" och vรคlja alla rader frรฅn den som visas i fรถljande skรคrmdump:

SQLite Visa

Tillfรคlliga vyer

Tillfรคlliga vyer รคr tillfรคlliga fรถr den aktuella databasanslutningen som anvรคnds fรถr att skapa den. Om du sedan stรคnger databasanslutningen kommer alla tillfรคlliga vyer att raderas automatiskt. Tillfรคlliga vyer skapas med nรฅgot av fรถljande kommandon:

  • SKAPA TEMP VISNING, eller
  • SKAPA TILLFร„LLIG VISNING.

Tillfรคlliga vyer รคr anvรคndbara om du vill gรถra vissa operationer fรถr tillfรคllet och inte behรถver vara en permanent vy. Sรฅ du skapar bara en tillfรคllig vy och gรถr sedan din bearbetning med den vyn. Later nรคr du stรคnger anslutningen till databasen kommer den att raderas automatiskt.

Exempel:

I fรถljande exempel kommer vi att รถppna en databasanslutning och sedan skapa en tillfรคllig vy.

Efter det kommer vi att stรคnga den anslutningen, och vi kommer att kontrollera om den tillfรคlliga vyn fortfarande finns eller inte.

Steg 1) ร–ppna sqlite3.exe frรฅn katalogen "C:\sqlite" som fรถrklarats tidigare.

Steg 2) ร–ppna en anslutning till databasen "TutorialsSampleDB.db" genom att kรถra fรถljande kommando:

.open TutorialsSampleDB.db

Steg 3) Skriv fรถljande kommando som skapar en temporรคr vy med namnet "AllStudentsTempView":

CREATE TEMP VIEW AllStudentsTempView
AS
  SELECT 
    s.StudentId,
    s.StudentName,
    s.DateOfBirth,
    d.DepartmentName
FROM Students AS s
INNER JOIN Departments AS d ON s.DepartmentId = d.DepartmentId;

SQLite Visa

Steg 4) Se till att den temporรคra vyn "AllStudentsTempView" skapas genom att kรถra fรถljande kommando:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

SQLite Visa

Steg 5) Stรคng sqlite3.exe och รถppna den igen.

Steg 6) ร–ppna en anslutning till databasen "TutorialsSampleDB.db" med fรถljande kommando:

.open TutorialsSampleDB.db

Steg 7) Kรถr fรถljande kommando fรถr att fรฅ listan รถver tillfรคlliga vyer som skapats i databasen:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

Du bรถr inte se nรฅgon utdata eftersom den tillfรคlliga vyn vi skapade raderas nรคr vi stรคngde databasanslutningen i fรถregรฅende steg. Annars, sรฅ lรคnge du hรฅller anslutningen till databasen รถppen, skulle du kunna se den tillfรคlliga vyn med data.

SQLite Visa

Anmรคrkningar:

  • Du kan inte anvรคnda satserna INSERT, DELETE eller UPDATE med vyer, bara du kan anvรคnda kommandot "select from views" som visas i steg 5 i CREATE View-exemplet.
  • Fรถr att ta bort en VIEW kan du anvรคnda "DROP VIEW"-satsen:
DROP VIEW AllStudentsView;

Fรถr att sรคkerstรคlla att vyn tas bort kan du kรถra fรถljande kommando som ger dig listan รถver vyer i databasen:

SELECT name FROM sqlite_master WHERE type = 'view';

Du kommer inte hitta nรฅgra vyer som returnerades nรคr vyn togs bort, enligt fรถljande:

SQLite Visa

Fรถrutom att รฅteranvรคnda komplexa frรฅgor med vyer, SQLite hรคmtar รคven matchande rader snabbare genom index.

SQLite index

Om du har en bok och du vill sรถka efter ett nyckelord i den boken. Du kommer att sรถka efter det nyckelordet i bokens index. Sedan kommer du att navigera till sidnumret fรถr det sรถkordet fรถr att lรคsa mer information om det sรถkordet.

Men om det inte finns nรฅgot index pรฅ den boken eller sidnummer, kommer du att skanna hela boken frรฅn bรถrjan till slutet tills du hittar nyckelordet du sรถker efter. Och detta รคr mycket svรฅrt, sรคrskilt nรคr du har ett index och en mycket lรฅngsam process fรถr att sรถka efter ett nyckelord.

Indexerar i SQLite (och samma koncept gรคller fรถr andra databashanteringssystem fungerar pรฅ samma sรคtt som indexen som finns pรฅ baksidan av bรถckerna.

Nรคr du sรถker efter nรฅgra rader i en SQLite tabell med sรถkkriterier, SQLite kommer att sรถka pรฅ alla rader i tabellen tills den hittar de rader du letar efter som matchar sรถkkriterierna. Och den processen blir vรคldigt lรฅngsam nรคr man har stรถrre bord.

Index kommer att pรฅskynda sรถkfrรฅgor fรถr data och hjรคlper till att utfรถra datahรคmtning frรฅn tabeller. Index definieras i tabellkolumnerna.

Fรถrbรคttra prestanda med index:

Index kan fรถrbรคttra prestandan fรถr att sรถka data i en tabell. Nรคr du skapar ett index pรฅ en kolumn, SQLite kommer att skapa en datastruktur fรถr det indexet dรคr varje fรคltvรคrde har en pekare till hela raden dรคr vรคrdet hรถr hemma.

Sedan, om du kรถr en frรฅga med ett sรถkvillkor pรฅ en kolumn som รคr en del av ett index, SQLite sรถker fรถrst efter vรคrdet pรฅ indexet. SQLite kommer inte att skanna hela tabellen efter det. Sedan kommer den att lรคsa platsen dรคr vรคrdet pekar pรฅ tabellraden. SQLite kommer att lokalisera raden pรฅ den platsen och hรคmta den.

Men om kolumnen du sรถker efter inte รคr en del av ett index, SQLite kommer att utfรถra en skanning efter kolumnvรคrdena fรถr att hitta de data du letar efter. Det blir vanligtvis en lรฅngsammare process om det inte finns nรฅgot index.

Fรถrestรคll dig en bok utan index och du mรฅste sรถka efter ett specifikt ord. Du kommer att skanna hela boken frรฅn fรถrsta sidan till sista sidan och leta efter det ordet. Men om du har ett register รถver den boken kommer du att leta efter ordet pรฅ den fรถrst. Hรคmta sidnumret dรคr det finns och navigera sedan till det. Vilket kommer att gรฅ mycket snabbare รคn att skanna hela boken frรฅn pรคrm till pรคrm.

SQLite SKAPA INDEX

Fรถr att skapa ett index pรฅ en kolumn bรถr du anvรคnda kommandot CREATE INDEX. Och du bรถr definiera det sรฅ hรคr:

  • Du mรฅste ange namnet pรฅ indexet efter kommandot CREATE INDEX.
  • Efter namnet pรฅ indexet mรฅste du sรคtta nyckelordet "ON", fรถljt av tabellnamnet dรคr indexet kommer att skapas.
  • Dรคrefter listan med kolumnnamn som anvรคnds fรถr indexet.
  • Du kan anvรคnda ett av fรถljande nyckelord "ASC" eller "DESC" efter valfritt kolumnnamn fรถr att ange en sorteringsordning som anvรคnds fรถr att ordna indexdata.

Exempel:

I fรถljande exempel skapar vi indexet "StudentNameIndex" i studenttabellen i databasen "Students" enligt fรถljande:

Steg 1) Navigera till mappen "C:\sqlite" som fรถrklarats tidigare.

Steg 2) ร–ppna sqlite3.exe.

Steg 3) ร–ppna databasen "TutorialsSampleDB.db" med fรถljande kommando:

.open TutorialsSampleDB.db

Steg 4) Skapa ett nytt index "StudentNameIndex" med fรถljande kommando:

CREATE INDEX StudentNameIndex ON Students(StudentName);

Du bรถr inte se nรฅgon utdata fรถr detta:

SQLite index

Steg 5) Fรถr att sรคkerstรคlla att indexet skapades kan du kรถra fรถljande frรฅga, som ger dig listan รถver index som skapats i tabellen Studenter:

PRAGMA index_list(Students);

Du bรถr se indexet vi just skapade returnerade:

SQLite index

Anmรคrkningar:

  • Index kan skapas inte bara baserat pรฅ kolumner utan ocksรฅ uttryck. Nรฅgot som det hรคr:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);

"OrderTotalIndex" kommer att baseras pรฅ OrderId-kolumnen och รคven pรฅ multiplikationen av kvantitetskolumnens vรคrde och priskolumnen. Sรฅ alla frรฅgor fรถr "OrderId" och "Quantity*Price" kommer att vara effektiva eftersom frรฅgan kommer att anvรคnda indexet.

  • Om du angav en WHERE-sats i CREATE INDEX-satsen kommer indexet att vara ett partiellt index. I det hรคr fallet kommer det att finnas poster i indexet endast fรถr de rader som matchar villkoren i WHERE-satsen. Till exempel i fรถljande index:
    CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price)
    WHERE Quantity > 10000;

    (I exemplet ovan kommer indexet att vara ett partiellt index eftersom det finns en WHERE-sats specificerad. I det hรคr fallet kommer indexet endast att tillรคmpas pรฅ de order som har ett kvantitetsvรคrde som รคr stรถrre รคn 10000 XNUMX. Observera att detta index kallas en partiell index pรฅ grund av WHERE-satsen, inte uttrycket som anvรคnds pรฅ den. Du kan dock anvรคnda uttrycken med normala index.)

  • Du kan anvรคnda CREATE UNIQUE INDEX-satsen istรคllet fรถr CREATE INDEX fรถr att fรถrhindra dubbla poster fรถr kolumnerna och dรคrmed blir alla vรคrden fรถr den indexerade kolumnen unika.
  • Fรถr att radera ett index, anvรคnd kommandot DROP INDEX fรถljt av indexnamnet fรถr att radera.

Medan index gรถr lรคsningar snabbare, lรฅter utlรถsare SQLite reagera automatiskt nรคr data รคndras.

SQLite Trigger

Introduktion till SQLite Trigger

Utlรถsare รคr automatiska fรถrdefinierade operationer som utfรถrs nรคr en specifik รฅtgรคrd intrรคffar pรฅ en databastabell. En utlรถsare kan definieras sรฅ att den aktiveras nรคr nรฅgon av fรถljande รฅtgรคrder intrรคffar pรฅ en tabell:

  • INFOGA i en tabell.
  • RADERA rader frรฅn en tabell.
  • UPPDATERA en av tabellkolumnerna.

SQLite stรถder FOR EACH ROW-utlรถsare sรฅ att de fรถrdefinierade operationerna i utlรถsaren kommer att utfรถras fรถr alla rader som รคr involverade i de รฅtgรคrder som intrรคffade pรฅ tabellen (oavsett om det รคr infoga, ta bort eller uppdatera).

SQLite SKAPA TRIGGER

Fรถr att skapa en ny TRIGGER kan du anvรคnda CREATE TRIGGER-satsen enligt fรถljande:

  • Efter CREATE TRIGGER bรถr du ange ett triggernamn.
  • Efter triggernamnet mรฅste du ange nรคr exakt triggernamnet ska exekveras. Du har tre alternativ:
    • BEFORE โ€“ utlรถsaren kommer att exekveras fรถre INSERT-, UPDATE- eller deletesatsen som anges.
    • Efter โ€“ utlรถsaren kommer att exekveras efter INSERT-, UPDATE- eller deletesatsen.
    • I STร„LLET Fร–R โ€“ Det kommer att ersรคtta den รฅtgรคrd som hรคnde som utlรถste triggern med den sats som anges i TRIGGER. I STร„LLET Fร–R trigger รคr inte tillรคmpligt med tabeller, bara med vyer.
  • Sedan mรฅste du ange typen av รฅtgรคrd, utlรถsaren kommer att aktiveras nรคr det hรคnder. Antingen DELETE, INSERT eller UPDATE.
  • Du kan vรคlja ett valfritt kolumnnamn sรฅ att utlรถsaren inte aktiveras om inte รฅtgรคrden hรคnde pรฅ den kolumnen.
  • Sedan mรฅste du ange tabellnamnet dรคr triggern ska skapas.
  • Inne i utlรถsarens kropp bรถr du ange den sats som ska kรถras fรถr varje rad nรคr utlรถsaren aktiveras.

Triggers kommer endast att aktiveras (avfyras) beroende pรฅ typen av satsen som anges i skapa trigger-kommandot. Till exempel:

  • BEFORE INSERT-utlรถsaren kommer att aktiveras (avfyras) fรถre nรฅgon insert-sats.
  • AFTER UPDATE-utlรถsaren kommer att aktiveras (avfyras) efter varje uppdateringssats, ... och sรฅ vidare.

Inuti utlรถsaren kan du referera till de nyligen infogade vรคrdena med nyckelordet "nya". Du kan ocksรฅ referera till de raderade eller uppdaterade vรคrdena med det gamla nyckelordet. Som fรถljande:

  • Inuti INSERT triggers โ€“ nytt nyckelord kan anvรคndas.
  • Inuti UPDATE-utlรถsare โ€“ nya och gamla sรถkord kan anvรคndas.
  • Inuti DELETE-utlรถsare โ€“ gamla nyckelord kan anvรคndas.

Exempelvis

I det fรถljande skapar vi en trigger som utlรถses innan en ny student infogas i tabellen "Studenter".

Den nya infogade studenten loggas i tabellen "StudentsLog" med en automatisk tidsstรคmpel fรถr det aktuella datumet och tiden dรฅ insert-satsen intrรคffade. Enligt fรถljande:

Steg 1) Navigera till katalogen "C:\sqlite" och kรถr sqlite3.exe.

Steg 2) ร–ppna databasen "TutorialsSampleDB.db" genom att kรถra fรถljande kommando:

.open TutorialsSampleDB.db

Steg 3) skapa triggern "InsertIntoStudentTrigger" genom att kรถra fรถljande kommando:

CREATE TRIGGER InsertIntoStudentTrigger 
       BEFORE INSERT ON Students
BEGIN
  INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert');
END;

Funktionen "datetime()" ger dig det aktuella datumet och tidsstรคmpeln nรคr insert-satsen intrรคffade. Sรฅ att vi kan logga insert-transaktionen med automatiska tidsstรคmplar tillagda till varje transaktion.

Kommandot bรถr kรถras framgรฅngsrikt och du fรฅr ingen utdata:

SQLite Trigger

Utlรถsaren โ€InsertIntoStudentTriggerโ€ aktiveras varje gรฅng du infogar en ny student i studenttabellen. Nyckelordet โ€newโ€ refererar till de vรคrden som ska infogas. Till exempel kommer โ€new.StudentIdโ€ att vara student-ID:t som ska infogas.

Nu ska vi testa hur triggern beter sig nรคr vi sรคtter in en ny elev.

Steg 4) Skriv fรถljande kommando som kommer att infoga en ny elev i elevtabellen:

INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');

Steg 5) Skriv fรถljande kommando som markerar alla rader frรฅn tabellen "StudentsLog":

SELECT * FROM StudentsLog;

Du bรถr se en ny rad returnerad fรถr den nya eleven som vi precis infogade:

SQLite Trigger

Den hรคr raden infogades av utlรถsaren innan den nya studenten med id 11 infogades.

I det hรคr exemplet anvรคnde vi triggern "InsertIntoStudentTrigger" som vi skapade fรถr att logga alla insert-transaktioner i tabellen "StudentsLog" automatiskt. Pรฅ samma sรคtt som du kan logga alla uppdateringar eller borttagningar.

Fรถrhindra oavsiktliga uppdateringar med triggers:

Genom att anvรคnda BEFORE UPDATE-utlรถsare i en tabell kan du fรถrhindra uppdateringssatserna i en kolumn baserad pรฅ ett uttryck.

Exempelvis

I fรถljande exempel kommer vi att fรถrhindra att nรฅgon uppdateringssats uppdaterar kolumnen "studentnamn" i tabellen Studenter:

Steg 1) Navigera till katalogen "C:\sqlite" och kรถr sqlite3.exe.

Steg 2) ร–ppna databasen "TutorialsSampleDB.db" genom att kรถra fรถljande kommando:

.open TutorialsSampleDB.db

Steg 3) Skapa en ny trigger "preventUpdateStudentName" i tabellen "Students" genom att kรถra fรถljande kommando

CREATE TRIGGER preventUpdateStudentName
BEFORE UPDATE OF StudentName ON Students
FOR EACH ROW
BEGIN
    SELECT RAISE(ABORT, 'You cannot update studentname');
END;

Kommandot โ€RAISEโ€ kommer att generera ett felmeddelande med felmeddelandet โ€Du kan inte uppdatera studentnamnโ€ och sedan fรถrhindra att uppdateringskommandot kรถrs.

Nu kommer vi att verifiera att utlรถsaren fungerar bra och att den fรถrhindrar uppdateringar fรถr kolumnen studentnamn.

Steg 4) Kรถr fรถljande uppdateringskommando, vilket uppdaterar studentnamnet "Jack" till "Jack1".

UPDATE Students SET StudentName = 'Jack1' WHERE StudentName = 'Jack';

Du bรถr fรฅ felmeddelandet vi angav pรฅ utlรถsaren, som sรคger att "Du kan inte uppdatera studentnamnet" enligt fรถljande:

SQLite Trigger

Steg 5) Kรถr fรถljande kommando, vilket kommer att vรคlja listan med elevnamn frรฅn elevtabellen.

SELECT StudentName FROM Students;

Du bรถr se att elevnamnet "Jack" fortfarande รคr detsamma och att det inte รคndras:

SQLite Trigger

Vanliga frรฅgor

En tabell lagrar fysiskt data pรฅ disk, medan en vy รคr en virtuell tabell som definieras av en sparad SELECT-sats. En vy innehรฅller inga egna data; den kรถr den frรฅgan varje gรฅng du lรคser den och presenterar rader frรฅn de underliggande tabellerna.

SQLite vyer รคr skrivskyddade, sรฅ INSERT, UPDATE och DELETE kan inte kรถras direkt mot dem. Fรถr att gรถra en vy skrivbar, koppla en INSTEAD OF-utlรถsare som รถversรคtter operationen till รคndringar i de underliggande bastabellerna.

Skapa ett index fรถr kolumner som anvรคnds ofta i WHERE-, JOIN- eller ORDER BY-klausuler, sรคrskilt kolumner med hรถg kardinalitet och fรฅ dubbletter. Index snabbar upp SELECT-sรถkningar, men att lรคgga till dem i sรคllan sรถkta eller mycket smรฅ tabeller ger liten nytta.

Ja. Varje index mรฅste uppdateras nรคr rader รคndras, sรฅ varje extra index lรคgger till skrivbelastning och lagringsutrymme. Indexera de kolumner du sรถker i ofta, men undvik att รถverindexera tabeller som fรฅr mycket INSERT-, UPDATE- eller DELETE-trafik.

Nej. SQLite har inget CREATE MATERIALIZED VIEW-kommando, och vanliga vyer cachar aldrig sina resultat. Fรถr att imitera en, skapa en riktig tabell och hรฅll den synkroniserad med hjรคlp av AFTER INSERT-, UPDATE- och DELETE-utlรถsare pรฅ kรคlltabellerna.

sqlite_master รคr den inbyggda schemakatalogen som listar alla tabeller, vyer, index och triggers i databasen. Kรถr en frรฅga, till exempel SELECT name FROM sqlite_master WHERE type = 'view';, fรถr att inspektera vilka objekt som finns.

Ja. AI-text-till-SQL-assistenter omvandlar fรถrfrรฅgningar pรฅ vanlig engelska till SQLite CREATE VIEW-, CREATE INDEX- och CREATE TRIGGER-satser. Att ange dina riktiga tabell- och kolumnnamn fรถrbรคttrar noggrannheten, och varje genererat sats bรถr granskas och testas innan den kรถrs pรฅ produktionsdata.

GitHub Copilot fรถreslรฅr SQLite vyer, index och utlรถsare inbรคddade i redigerare som VS CodeDen lรคser nรคrliggande scheman och kommentarer, sรฅ kompletteringar รฅteranvรคnder dina riktiga tabell- och kolumnnamn, men du bรถr fortfarande verifiera varje sats innan du kรถr den.

Sammanfatta detta inlรคgg med: