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.

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":
Steg 2) รppna databasen "TutorialsSampleDB.db" med fรถljande kommando:
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:
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:
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:
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;
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';
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.
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:
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:
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:
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:
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:
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:
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:















