SQLite Trigger, Views & Index med exempel

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 kommer vi att skapa en vy med namnet "All StudentsView" 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 borde se utsikten "All StudentsView" 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 tillfรคllig vy "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;

SQLite Visa

Steg 4) Se till att tempvyn "All StudentsTempView" 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

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 kommer vi att skapa ett index "StudentNameIndexโ€ pรฅ elevbordet i โ€Studenter" databas 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 "StudentnamnIndex" 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.

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 kommer vi att skapa en utlรถsare som aktiveras innan vi infogar en ny elev i "Studenterโ€Tabell.

    Det kommer att logga in den nyligen infogade studenten i tabellen "Studentloggโ€ med en automatisk tidsstรคmpel fรถr det aktuella datumet och klockan nรคr infogningssatsen intrรคffade. Som 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 "datum Tid()" ger dig det aktuella datumet och tidsstรคmpeln nรคr infogningssatsen hรคnde. Sรฅ att vi kan logga insรคttningstransaktionen med automatiska tidsstรคmplar som lรคggs till varje transaktion.

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

    SQLite Trigger

    Utlรถsaren "InsertIntoStudentTriggerโ€ avfyras varje gรฅng du infogar en ny elev i elevtabellen. den "nyโ€ nyckelord hรคnvisar till de vรคrden som kommer att infogas. Till exempel "new.StudentIdโ€ kommer att vara student-id som kommer att 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 kommer att vรคlja alla rader frรฅn "Studentlogg" tabell:

    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 " vi skapade, fรถr att logga eventuella infoga transaktioner i tabellen "Studentloggโ€ automatiskt. Pรฅ samma sรคtt kan du logga vilken uppdatering som helst, eller ta bort uttalanden.

    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" pรฅ bordet "Studenter" 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;

    Den "Hร–JAโ€kommandot kommer att visa ett fel med ett felmeddelande โ€ Du kan inte uppdatera studentnamn ", och dรฅ kommer det att fรถrhindra att uppdateringssatsen 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, som kommer att uppdatera elevens namn "jack" att vara "Jack1".

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

    Du bรถr fรฅ felmeddelandet som vi angav pรฅ avtryckaren, som sรคger att "Du kan inte uppdatera studentnamn" 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

    Sammanfattning

    Visningar, index och utlรถsare รคr mycket kraftfulla verktyg fรถr att administrera en SQLite databas. Du kan spรฅra dataรคndringsoperationerna nรคr de sker pรฅ en tabell. Du kan ocksรฅ optimera datahรคmtningen genom att skapa index.

    Sammanfatta detta inlรคgg med: