SQLite Trigger, visninger og indeks med eksempel
I den daglige bruken av SQLite, trenger du noen administrative verktรธy over databasen. Du kan ogsรฅ bruke dem til รฅ gjรธre spรธrring i databasen mer effektivt ved รฅ lage indekser, eller mer gjenbrukbare ved รฅ opprette visninger.
SQLite Se
Visninger ligner veldig pรฅ tabeller. Men visninger er logiske tabeller; de lagres ikke fysisk som bord. En visning er sammensatt av en utvalgt setning.
Du kan definere en visning for de komplekse spรธrringene dine, og du kan bruke disse spรธrringene pรฅ nytt nรฅr du vil ved รฅ ringe visningen direkte i stedet for รฅ omskrive spรธrringene pรฅ nytt.
CREATE VIEW-uttalelse
For รฅ opprette en visning pรฅ en database, kan du bruke CREATE VIEW-setningen etterfulgt av visningsnavnet, og deretter sette sรธket du รธnsker etter det.
Eksempel: I fรธlgende eksempel vil vi lage en visning med navnet "All StudentsView" i eksempeldatabasen "TutorialsSampleDB.db" som fรธlgende:
Trinn 1) ร pne Min datamaskin og naviger til fรธlgende katalog "C:\sqlite" og รฅpne deretter "sqlite3.exe"
Trinn 2) ร pne databasen "TutorialsSampleDB.db" med fรธlgende kommando:
Trinn 3) Fรธlgende er en grunnleggende syntaks for sqlite3-kommandoen for รฅ lage View
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 skal ikke vรฆre noe utdata fra kommandoen som dette:
Trinn 4) For รฅ sikre at visningen er opprettet, kan du velge listen over visninger i databasen ved รฅ kjรธre fรธlgende kommando:
SELECT name FROM sqlite_master WHERE type = 'view';
Du bรธr se utsikten "All StudentsView" returneres:
Trinn 5) Nรฅ er visningen vรฅr opprettet, du kan bruke den som en vanlig tabell noe slikt:
SELECT * FROM AllStudentsView;
Denne kommandoen vil spรธrre visningen "AllStudents" og velge alle radene fra den som vist i fรธlgende skjermbilde:
Midlertidige visninger
Midlertidige visninger er midlertidige for den gjeldende databasetilkoblingen som brukes til รฅ opprette den. Sรฅ hvis du lukker databasetilkoblingen vil alle de midlertidige visningene bli slettet automatisk. Midlertidige visninger opprettes ved hjelp av en av fรธlgende kommandoer:
- LAG TEMPVISNING, eller
- LAG MIDLERTIDIG VISNING.
Midlertidige visninger er nyttige hvis du vil gjรธre noen operasjoner for tiden og ikke trenger at det skal vรฆre en permanent visning. Sรฅ du oppretter bare en midlertidig visning, og gjรธr deretter behandlingen ved รฅ bruke den visningen. Later nรฅr du lukker forbindelsen med databasen, slettes den automatisk.
Eksempel:
I det fรธlgende eksempelet รฅpner vi en databasetilkobling, og deretter oppretter vi en midlertidig visning.
Etter det vil vi lukke den forbindelsen, og vi vil sjekke om den midlertidige visningen fortsatt eksisterer eller ikke.
Trinn 1) ร pne sqlite3.exe fra katalogen "C:\sqlite" som forklart fรธr.
Trinn 2) ร pne en tilkobling til databasen "TutorialsSampleDB.db" ved รฅ kjรธre fรธlgende kommando:
.open TutorialsSampleDB.db
Trinn 3) Skriv fรธlgende kommando som vil lage en midlertidig visning "All StudentsTempView":
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;
Trinn 4) Sรธrg for at tempvisningen "All StudentsTempView" opprettes ved รฅ kjรธre fรธlgende kommando:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
Trinn 5) Lukk sqlite3.exe og รฅpne den igjen.
Trinn 6) ร pne en tilkobling til databasen "TutorialsSampleDB.db" med fรธlgende kommando:
.open TutorialsSampleDB.db
Trinn 7) Kjรธr fรธlgende kommando for รฅ fรฅ listen over midlertidig visning opprettet pรฅ databasen:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
Du bรธr ikke se noen utdata da den midlertidige visningen vi opprettet slettes nรฅr vi lukket databasetilkoblingen i forrige trinn. Ellers, sรฅ lenge du holder forbindelsen med databasen รฅpen, vil du kunne se den midlertidige visningen med data.
Merknader:
- Du kan ikke bruke setningene INSERT, DELETE eller UPDATE med visninger, bare du kan bruke kommandoen "velg fra visninger" som vist i trinn 5 i CREATE View-eksemplet.
- For รฅ slette en VIEW, kan du bruke "DROP VIEW"-setningen:
DROP VIEW AllStudentsView;
For รฅ sikre at visningen blir slettet, kan du kjรธre fรธlgende kommando som gir deg listen over visninger i databasen:
SELECT name FROM sqlite_master WHERE type = 'view';
Du vil ikke finne noen visninger returnert da visningen ble slettet, som fรธlger:
SQLite Index
Hvis du har en bok, og du vil sรธke etter et nรธkkelord i den boken. Du vil sรธke etter det sรธkeordet i indeksen til boken. Deretter vil du navigere til sidenummeret for det sรธkeordet for รฅ lese mer informasjon om det sรธkeordet.
Men hvis det ikke er noen indeks pรฅ den boken eller sidetall, vil du skanne hele boken fra begynnelsen til slutten til du finner nรธkkelordet du sรธker etter. Og dette er veldig vanskelig, spesielt nรฅr du har en indeks og veldig langsom prosess for รฅ sรธke etter et nรธkkelord.
Indekser i SQLite (og det samme konseptet gjelder for andre databasesystemer fungerer pรฅ samme mรฅte som indeksene som finnes bak i bรธkene.
Nรฅr du sรธker etter noen rader i en SQLite tabell med sรธkekriterier, SQLite vil sรธke pรฅ alle radene i tabellen til den finner radene du leter etter som samsvarer med sรธkekriteriene. Og den prosessen blir veldig treg nรฅr du har stรธrre bord.
Indekser vil รธke hastigheten pรฅ sรธk etter data og vil bidra til รฅ utfรธre datahenting fra tabeller. Indekser er definert i tabellkolonnene.
Forbedre ytelsen med indekser:
Indekser kan forbedre ytelsen til รฅ sรธke data pรฅ en tabell. Nรฅr du oppretter en indeks pรฅ en kolonne, SQLite vil lage en datastruktur for den indeksen der hver feltverdi har en peker til hele raden der verdien hรธrer hjemme.
Deretter, hvis du kjรธrer et sรธk med en sรธkebetingelse pรฅ en kolonne som er en del av en indeks, SQLite vil fรธrst slรฅ opp etter verdien pรฅ indeksen. SQLite vil ikke skanne hele tabellen for det. Deretter vil den lese plasseringen der verdien peker for tabellraden. SQLite vil finne raden pรฅ den plasseringen og hente den.
Men hvis kolonnen du sรธker etter, ikke er en del av en indeks, SQLite vil utfรธre en skanning etter kolonneverdiene for รฅ finne dataene du leter etter. Det vil vanligvis vรฆre en langsommere prosess hvis det ikke er noen indeks.
Se for deg en bok uten indeks og du mรฅ sรธke etter et spesifikt ord. Du vil skanne hele boken fra fรธrste side til siste side pรฅ jakt etter det ordet. Men hvis du har en indeks pรฅ den boken, vil du fรธrst se etter ordet pรฅ den. Fรฅ sidenummeret der det er plassert, og naviger deretter til det. Noe som vil vรฆre mye raskere enn รฅ skanne hele boken fra perm til perm.
SQLite OPPRETT INDEKS
For รฅ lage en indeks pรฅ en kolonne, bรธr du bruke kommandoen CREATE INDEX. Og du bรธr definere det som fรธlger:
- Du mรฅ spesifisere navnet pรฅ indeksen etter CREATE INDEX-kommandoen.
- Etter navnet pรฅ indeksen mรฅ du sette nรธkkelordet "Pร ", etterfulgt av tabellnavnet der indeksen skal opprettes.
- Deretter listen over kolonnenavn som brukes til indeksen.
- Du kan bruke ett av fรธlgende nรธkkelord "ASC" eller "DESC" etter et kolonnenavn for รฅ spesifisere en sorteringsrekkefรธlge som brukes til รฅ bestille indeksdata.
Eksempel:
I fรธlgende eksempel vil vi lage en indeks "StudentNameIndexโ pรฅ elevbordet i โStudenter" database som fรธlger:
Trinn 1) Naviger til mappen "C:\sqlite" som forklart fรธr.
Trinn 2) ร pne sqlite3.exe.
Trinn 3) ร pne databasen "TutorialsSampleDB.db" med fรธlgende kommando:
.open TutorialsSampleDB.db
Trinn 4) Opprett en ny indeks "Studentnavnindeks" ved รฅ bruke fรธlgende kommando:
CREATE INDEX StudentNameIndex ON Students(StudentName);
Du skal ikke se noen utdata for dette:
Trinn 5) For รฅ sikre at indeksen ble opprettet kan du kjรธre fรธlgende spรธrring, som gir deg listen over indekser som er opprettet i tabellen Studenter:
PRAGMA index_list(Students);
Du bรธr se indeksen vi nettopp opprettet returnerte:
Merknader:
- Indekser kan opprettes ikke bare basert pรฅ kolonner, men ogsรฅ uttrykk. Noe sรฅnt som dette:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);
"OrderTotalIndex" vil vรฆre basert pรฅ OrderId-kolonnen og ogsรฅ pรฅ multiplikasjonen av Quantity-kolonneverdien og Pris-kolonnen. Sรฅ alle spรธrringer for "OrderId" og "Quantity*Price" vil vรฆre effektive ettersom spรธrringen vil bruke indeksen.
- Hvis du spesifiserte en WHERE-klausul i CREATE INDEX-setningen, vil indeksen vรฆre en delvis indeks. I dette tilfellet vil det vรฆre oppfรธringer i indeksen for bare radene som samsvarer med betingelsene i WHERE-leddet. For eksempel i fรธlgende indeks:
CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price) WHERE Quantity > 10000;
( I eksemplet ovenfor vil indeksen vรฆre en delvis indeks ettersom det er spesifisert en WHERE-klausul. I dette tilfellet vil indeksen bare brukes pรฅ de bestillingene som har en kvantitetsverdi stรธrre enn 10000 XNUMX. Merk at denne indeksen kalles en delvis indeks pรฅ grunn av WHERE-klausulen, ikke uttrykket som brukes pรฅ den. Du kan imidlertid bruke uttrykkene med normale indekser.)
- Du kan bruke CREATE UNIQUE INDEX-setningen i stedet for CREATE INDEX for รฅ forhindre dupliserte oppfรธringer for kolonnene og dermed vil alle verdiene for den indekserte kolonnen vรฆre unike.
- For รฅ slette en indeks, bruk DROP INDEX-kommandoen etterfulgt av indeksnavnet for รฅ slette.
SQLite Avtrekker
Introduksjon til SQLite Avtrekker
Utlรธsere er automatiske forhรฅndsdefinerte operasjoner som utfรธres nรฅr en spesifikk handling skjer pรฅ en databasetabell. En utlรธser kan defineres til รฅ utlรธses nรฅr en av fรธlgende handlinger skjer pรฅ en tabell:
- SETTE INN i en tabell.
- SLETT rader fra en tabell.
- OPPDATERT en av tabellkolonnene.
SQLite stรธtter FOR HVER ROW-utlรธser slik at de forhรฅndsdefinerte operasjonene i utlรธseren vil bli utfรธrt for alle radene som er involvert i handlingene som skjedde pรฅ tabellen (enten det er sett inn, slett eller oppdatering).
SQLite SKAP TRIGGER
For รฅ opprette en ny TRIGGER, kan du bruke CREATE TRIGGER-setningen som fรธlger:
- Etter CREATE TRIGGER, bรธr du spesifisere et utlรธsernavn.
- Etter utlรธsernavnet mรฅ du spesifisere nรฅr nรธyaktig utlรธsernavnet skal utfรธres. Du har tre alternativer:
- FรR โ utlรธseren vil bli utfรธrt fรธr INSERT-, UPDATE- eller delete-setningen som er spesifisert.
- Etter โ utlรธseren vil bli utfรธrt etter INSERT-, UPDATE- eller delete-setningen som er spesifisert.
- I STEDET FOR โ Det vil erstatte handlingen som skjedde som utlรธste utlรธseren med setningen spesifisert i TRIGGEREN. I STEDET FOR trigger er ikke aktuelt med tabeller, kun med visninger.
Triggere vil bare aktiveres (utlรธses) avhengig av typen setning som er spesifisert pรฅ create trigger-kommandoen. For eksempel:
- BEFORE INSERT-utlรธseren vil bli aktivert (utlรธst) fรธr enhver insert-setning.
- ETTER UPDATE-utlรธseren vil bli aktivert (utlรธst) etter enhver oppdateringssetning, ... og sรฅ videre.
Inne i utlรธseren kan du referere til de nylig innsatte verdiene ved รฅ bruke nรธkkelordet "nye". Du kan ogsรฅ referere til de slettede eller oppdaterte verdiene ved รฅ bruke det gamle nรธkkelordet. Som fรธlgende:
- Inne i INSERT-utlรธsere โ nytt nรธkkelord kan brukes.
- Inne i UPDATE-utlรธsere โ nye og gamle sรธkeord kan brukes.
- Inne i DELETE-utlรธsere โ gamle sรธkeord kan brukes.
Eksempel
I det fรธlgende vil vi lage en utlรธser som utlรธses fรธr vi setter inn en ny student i "StudenterโBord.
Den vil logge den nylig innsatte studenten inn i tabellen "Studentloggโ med et automatisk tidsstempel for gjeldende dato og klokkeslett da insert-setningen skjedde. Som fรธlgende:
Trinn 1) Naviger til katalogen "C:\sqliteโ og kjรธr sqlite3.exe.
Trinn 2) ร pne databasen "TutorialsSampleDB.db" ved รฅ kjรธre fรธlgende kommando:
.open TutorialsSampleDB.db
Trinn 3) lag utlรธseren "InsertIntoStudentTrigger" Ved รฅ kjรธre fรธlgende kommando:
CREATE TRIGGER InsertIntoStudentTrigger
BEFORE INSERT ON Students
BEGIN
INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert');
END;
Funksjonen "datetime()" vil gi deg gjeldende dato og klokkeslett da insert-setningen skjedde. Slik at vi kan logge innsettingstransaksjonen med automatiske tidsstempler lagt til hver transaksjon.
Kommandoen skal kjรธre vellykket, og du fรฅr ingen utdata:
Utlรธseren "InsertIntoStudentTriggerโ vil avfyres hver gang du setter inn en ny elev i elevtabellen. ยซnytt" nรธkkelord refererer til verdiene som vil bli satt inn. For eksempel, "new.StudentIdโ vil vรฆre student-ID-en som skal settes inn.
Nรฅ skal vi teste hvordan triggeren oppfรธrer seg nรฅr vi setter inn en ny student.
Trinn 4) Skriv fรธlgende kommando som vil sette inn en ny elev i elevtabellen:
INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');
Trinn 5) Skriv fรธlgende kommando som vil velge alle radene fra "Studentlogg" tabell:
SELECT * FROM StudentsLog;
Du skal se en ny rad returnert for den nye studenten vi nettopp la inn:
Denne raden ble satt inn av utlรธseren fรธr den nye studenten med id 11 ble satt inn.
I dette eksemplet brukte vi triggeren " InsertIntoStudentTrigger " vi opprettet, for รฅ logge inn eventuelle transaksjoner i tabellen "Studentlogg" automatisk. Pรฅ samme mรฅte kan du logge enhver oppdatering, eller slette uttalelser.
Forhindrer utilsiktede oppdateringer med triggere:
Ved รฅ bruke FรR UPDATE-utlรธsere pรฅ en tabell, kan du forhindre oppdateringssetningene i en kolonne basert pรฅ et uttrykk.
Eksempel
I det fรธlgende eksempelet vil vi forhindre at enhver oppdateringssetning oppdaterer "studentnavn"-kolonnen i Studenter-tabellen:
Trinn 1) Naviger til katalogen "C:\sqliteโ og kjรธr sqlite3.exe.
Trinn 2) ร pne databasen "TutorialsSampleDB.db" ved รฅ kjรธre fรธlgende kommando:
.open TutorialsSampleDB.db
Trinn 3) Opprett en ny trigger "preventUpdateStudentName"pรฅ bordet"Studenter" ved รฅ kjรธre fรธlgende kommando
CREATE TRIGGER preventUpdateStudentName
BEFORE UPDATE OF StudentName ON Students
FOR EACH ROW
BEGIN
SELECT RAISE(ABORT, 'You cannot update studentname');
END;
Den "HรY" kommandoen vil gi en feilmelding med en feilmelding " Du kan ikke oppdatere studentnavn ", og da vil det forhindre at oppdateringssetningen kjรธres.
Nรฅ vil vi bekrefte at utlรธseren fungerer bra, og den forhindrer enhver oppdatering for elevnavn-kolonnen.
Trinn 4) Kjรธr fรธlgende oppdateringskommando, som vil oppdatere elevnavnet "jekk"รฅ vรฆre"Jack1".
UPDATE Students SET StudentName = 'Jack1' WHERE StudentName = 'Jack';
Du bรธr fรฅ feilmeldingen vi spesifiserte pรฅ utlรธseren, som sier at "Du kan ikke oppdatere studentnavn" som fรธlgende:
Trinn 5) Kjรธr fรธlgende kommando, som vil velge listen over elevenes navn fra elevtabellen.
SELECT StudentName FROM Students;
Du bรธr se at elevnavnet "Jack" fortsatt er det samme og at det ikke endres:
Sammendrag
Visninger, indekser og utlรธsere er veldig kraftige verktรธy for รฅ administrere en SQLite database. Du kan spore dataendringsoperasjonene nรฅr de skjer pรฅ en tabell. Du kan ogsรฅ optimalisere datainnhentingsoperasjonen ved รฅ lage indekser.















