SQLite Trigger, megtekintések és indexelés példával
A napi használat során SQLite, szüksége lesz néhány adminisztrációs eszközre az adatbázison keresztül. Segítségükkel hatékonyabbá teheti az adatbázis lekérdezését indexek létrehozásával, vagy újrafelhasználhatóbbá nézetek létrehozásával.
SQLite Kilátás
A nézetek nagyon hasonlítanak a táblázatokhoz. De a nézetek logikai táblázatok; fizikailag nem tárolják őket, mint az asztalokat. A nézet egy select utasításból áll.
Meghatározhat egy nézetet az összetett lekérdezésekhez, és bármikor újra felhasználhatja ezeket a lekérdezéseket úgy, hogy közvetlenül meghívja a nézetet ahelyett, hogy újraírná a lekérdezéseket.
CREATE VIEW utasítás
Nézet létrehozásához egy adatbázisban használhatja a CREATE VIEW utasítást, majd a nézet nevét, majd ezt követően helyezheti el a kívánt lekérdezést.
Példa: A következő példában létrehozunk egy nézetet "AllStudentsView" a minta adatbázisban "TutorialsSampleDB.db” a következőképpen:
Step 1) Nyissa meg a Sajátgépet, és keresse meg a következő könyvtárat:C:\sqlite", majd nyissa meg a "sqlite3.exe"
Step 2) Nyissa meg az adatbázist "TutorialsSampleDB.db” a következő paranccsal:
Step 3) Az alábbiakban bemutatjuk az sqlite3 parancs alapvető szintaxisát a nézet létrehozásához
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;
A parancsnak nem szabad ilyen kimenetet adnia:
Step 4) A nézet létrehozásának biztosításához a következő parancs futtatásával kiválaszthatja a nézetek listáját az adatbázisban:
SELECT name FROM sqlite_master WHERE type = 'view';
Látnod kell a kilátást"AllStudentsView” visszakerül:
Step 5) Most létrejött a nézetünk, használhatja normál táblázatként, ilyesmi:
SELECT * FROM AllStudentsView;
Ez a parancs lekérdezi az „AllStudents” nézetet, és kijelöli belőle az összes sort a következő képernyőképen látható módon:
Ideiglenes nézetek
Az ideiglenes nézetek ideiglenesek a létrehozásához használt aktuális adatbázis-kapcsolathoz. Ezután, ha lezárja az adatbázis-kapcsolatot, az összes ideiglenes nézet automatikusan törlődik. Az ideiglenes nézetek a következő parancsok egyikével hozhatók létre:
- TEMP NÉZET LÉTREHOZÁSA, ill
- IDEIGLENES NÉZET LÉTREHOZÁSA.
Az ideiglenes nézetek akkor hasznosak, ha egyelőre szeretne néhány műveletet elvégezni, és nincs szüksége arra, hogy állandó nézet legyen. Tehát csak hozzon létre egy ideiglenes nézetet, majd végezze el a feldolgozást ezzel a nézettel. Later amikor megszakítja a kapcsolatot az adatbázissal, az automatikusan törlődik.
Példa:
A következő példában megnyitunk egy adatbázis-kapcsolatot, majd létrehozunk egy ideiglenes nézetet.
Ezt követően lezárjuk a kapcsolatot, és ellenőrizzük, hogy az ideiglenes nézet még mindig létezik-e vagy sem.
Step 1) Nyissa meg az sqlite3.exe fájlt a " könyvtárbólC:\sqlite” ahogy korábban elmagyaráztuk.
Step 2) Nyisson meg egy kapcsolatot az adatbázissal "TutorialsSampleDB.db” a következő parancs futtatásával:
.open TutorialsSampleDB.db
Step 3) Írja be a következő parancsot, amely ideiglenes nézetet hoz létre "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;
Step 4) Győződjön meg arról, hogy a hőmérséklet nézet "AllStudentsTempView” a következő parancs futtatásával jön létre:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
Step 5) Zárja be az sqlite3.exe fájlt, és nyissa meg újra.
Step 6) Nyisson meg egy kapcsolatot az adatbázissal "TutorialsSampleDB.db” a következő paranccsal:
.open TutorialsSampleDB.db
Step 7) Futtassa a következő parancsot az adatbázisban létrehozott ideiglenes nézet listájának lekéréséhez:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
Nem kell semmilyen kimenetet látnia, mivel az általunk létrehozott ideiglenes nézet törlődik, amikor az előző lépésben lezártuk az adatbázis-kapcsolatot. Ellenkező esetben, amíg nyitva tartja a kapcsolatot az adatbázissal, láthatja az ideiglenes nézetet adatokkal.
Megjegyzések:
- Nem használhatja az INSERT, DELETE vagy UPDATE utasításokat nézeteknél, csak a „select from view” parancsot használhatja, amint az a nézet LÉTREHOZÁSA példa 5. lépésében látható.
- A VIEW törléséhez használja a „DROP VIEW” utasítást:
DROP VIEW AllStudentsView;
A nézet törlésének biztosításához futtassa a következő parancsot, amely megadja az adatbázisban lévő nézetek listáját:
SELECT name FROM sqlite_master WHERE type = 'view';
A nézet törlésével visszaadott nézet nem jelenik meg, az alábbiak szerint:
SQLite index
Ha van egy könyve, és keresni szeretne egy kulcsszót a könyvhöz. Erre a kulcsszóra keresni fog a könyv indexében. Ezután a kulcsszóhoz tartozó oldalszámra navigál, ahol további információkat olvashat a kulcsszóról.
Ha azonban nincs index a könyvön vagy oldalszámok, akkor az egész könyvet az elejétől a végéig beolvassa, amíg meg nem találja a keresett kulcsszót. És ez nagyon nehéz, különösen akkor, ha van egy index és nagyon lassú a kulcsszó keresési folyamata.
Indexek be SQLite (és ugyanez a fogalom másra is érvényes adatbázis-kezelő rendszerek is) ugyanúgy működik, mint a könyvek hátulján található indexek.
Amikor néhány sort keres egy SQLite táblázat keresési feltételekkel, SQLite a táblázat összes sorában keresni fog, amíg meg nem találja azokat a sorokat, amelyek megfelelnek a keresési feltételeknek. És ez a folyamat nagyon lelassul, ha nagyobb asztalok vannak.
Az indexek felgyorsítják az adatok keresését, és segítik az adatok táblákból történő lekérését. Az indexek a táblázat oszlopaiban vannak meghatározva.
A teljesítmény javítása indexekkel:
Az indexek javíthatják az adatok táblán történő keresésének teljesítményét. Amikor indexet hoz létre egy oszlopon, SQLite létrehoz egy adatstruktúrát az indexhez, ahol minden mezőértéknek van egy mutatója arra a teljes sorra, amelyhez az érték tartozik.
Ezután, ha olyan lekérdezést futtat le keresési feltétellel egy oszlopban, amely egy index része, SQLite először megkeresi az értéket az indexen. SQLite nem fogja átvizsgálni az egész táblázatot. Ezután beolvassa azt a helyet, ahol a táblázat sorának értéke mutat. SQLite megkeresi a sort az adott helyen, és visszakeresi.
Ha azonban a keresett oszlop nem része egy indexnek, SQLite elvégzi az oszlopértékek beolvasását, hogy megtalálja a keresett adatokat. Általában lassabb folyamat lesz, ha nincs index.
Képzeljen el egy könyvet, amelyen nincs index, és egy adott szóra kell keresnie. Az egész könyvet az első oldaltól az utolsó oldalig átvizsgálja, keresve a szót. Ha azonban van indexe a könyvön, akkor először keresse meg a szót rajta. Keresse meg az oldalszámot, ahol található, majd navigáljon hozzá. Ami sokkal gyorsabb lesz, mint az egész könyvet a borítótól a borítóig beszkennelni.
SQLite INDEX létrehozása
Ha indexet szeretne létrehozni egy oszlopon, használja a CREATE INDEX parancsot. És ezt a következőképpen kell meghatároznia:
- A CREATE INDEX parancs után meg kell adni az index nevét.
- Az index neve után az „ON” kulcsszót kell beírni, majd a táblázat nevét, amelyben az index létrejön.
- Ezután az indexhez használt oszlopnevek listája.
- Bármely oszlopnév után használhatja az alábbi „ASC” vagy „DESC” kulcsszavak egyikét az indexadatok rendezéséhez használt rendezési sorrend meghatározásához.
Példa:
A következő példában létrehozunk egy indexet „StudentNameIndex" a diákasztalon a "Diákok” adatbázis az alábbiak szerint:
Step 1) Keresse meg a mappát "C:\sqlite” ahogy korábban elmagyaráztuk.
Step 2) Nyissa meg az sqlite3.exe fájlt.
Step 3) Nyissa meg az adatbázist "TutorialsSampleDB.db” a következő paranccsal:
.open TutorialsSampleDB.db
Step 4) Hozzon létre egy új indexet "StudentNameIndex” a következő paranccsal:
CREATE INDEX StudentNameIndex ON Students(StudentName);
Ehhez nem kell kimenetet látnia:
Step 5) Az index létrehozásának biztosításához futtathatja a következő lekérdezést, amely megadja a Diákok táblázatban létrehozott indexek listáját:
PRAGMA index_list(Students);
Látnia kell az imént létrehozott indexet:
Megjegyzések:
- Indexek nem csak oszlopok, hanem kifejezések alapján is létrehozhatók. Valami ilyesmi:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);
Az „OrderTotalIndex” az OrderId oszlopon, valamint a Mennyiség és az Ár oszlop értékének szorzatán alapul. Tehát a „Rendelésazonosító” és a „Mennyiség*Ár” lekérdezése hatékony lesz, mivel a lekérdezés az indexet használja.
- Ha a CREATE INDEX utasításban WHERE záradékot adott meg, az index részleges index lesz. Ebben az esetben csak a WHERE záradék feltételeinek megfelelő sorokhoz lesznek bejegyzések az indexben. Például a következő indexben:
CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price) WHERE Quantity > 10000;
(A fenti példában az index egy részindex, mivel WHERE záradék van megadva. Ebben az esetben az index csak azokra a rendelésekre vonatkozik, amelyek mennyiségi értéke nagyobb, mint 10000. Vegye figyelembe, hogy ezt az indexet részlegesnek nevezik. index a WHERE záradék miatt, nem a rajta használt kifejezés. Azonban használhatja a normál indexekkel rendelkező kifejezéseket.)
- Használhatja a CREATE UNIQUE INDEX utasítást a CREATE INDEX helyett, hogy megakadályozza az ismétlődő bejegyzéseket az oszlopokban, és így az indexelt oszlop minden értéke egyedi lesz.
- Egy index törléséhez használja a DROP INDEX parancsot, majd írja be a törölni kívánt index nevét.
SQLite ravasz
Bevezetés a SQLite ravasz
A triggerek automatikus előre definiált műveletek, amelyek akkor futnak le, amikor egy adott művelet történik egy adatbázistáblán. Meghatározható, hogy az eseményindító aktiválódjon, ha a következő műveletek valamelyike történik egy táblán:
- INSERT egy táblázatba.
- Sorok törlése a táblázatból.
- FRISSÍTÉSE a táblázat egyik oszlopát.
SQLite támogatja az MINDEN SOR triggert, így a triggerben előre meghatározott műveletek végrehajtásra kerülnek a táblán végrehajtott műveletekben érintett összes sorra (legyen szó beszúrásról, törlésről vagy frissítésről).
SQLite TRIGGER LÉTREHOZÁSA
Új TRIGGER létrehozásához használhatja a CREATE TRIGGER utasítást a következők szerint:
- A CREATE TRIGGER után meg kell adnia a trigger nevét.
- A trigger neve után meg kell adni, hogy pontosan mikor kell végrehajtani a trigger nevét. Három lehetőség közül választhat:
- BEFORE – a trigger a megadott INSERT, UPDATE vagy delete utasítás előtt kerül végrehajtásra.
- After – a trigger a megadott INSERT, UPDATE vagy delete utasítás után kerül végrehajtásra.
- HELYETT – A triggert elindító megtörtént műveletet a TRIGGER-ben megadott utasításra cseréli. Az INSTEAD OF trigger nem alkalmazható táblázatoknál, csak nézetek esetén.
A triggerek csak a trigger létrehozása parancsban megadott utasítás típusától függően lesznek aktiválva (égetve). Például:
- A BEFORE INSERT trigger minden insert utasítás előtt aktiválódik (kiütődik).
- Az AFTER UPDATE trigger minden frissítési utasítás után aktiválódik (kilövellődik), … és így tovább.
A triggerben az „új” kulcsszó használatával hivatkozhat az újonnan beillesztett értékekre. A törölt vagy frissített értékekre is hivatkozhat a régi kulcsszó használatával. A következőképpen:
- Az INSERT triggerek belsejében – új kulcsszó használható.
- Az UPDATE triggereken belül – új és régi kulcsszavak is használhatók.
- A DELETE triggerek belsejében – régi kulcsszó használható.
Példa
A következőkben létrehozunk egy aktiválási szabályt, amely aktiválódik, mielőtt új tanulót illeszt be a „Diákok" asztal.
Az újonnan beillesztett tanulót a táblázatba naplózzaStudentsLog” egy automatikus időbélyegzővel az aktuális dátumhoz, és az insert utasításhoz. A következőképpen:
Step 1) Navigáljon a „könyvtárba”C:\sqlite” és futtassa az sqlite3.exe fájlt.
Step 2) Nyissa meg az adatbázist "TutorialsSampleDB.db” a következő parancs futtatásával:
.open TutorialsSampleDB.db
Step 3) hozza létre a triggert "InsertIntoStudentTrigger” A következő parancs futtatásával:
CREATE TRIGGER InsertIntoStudentTrigger BEFORE INSERT ON Students BEGIN INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert'); END;
A funkció "dátum idő()" megadja az aktuális dátum időbélyegzőjét, amikor az insert utasítás megtörtént. Hogy a beszúrt tranzakciót minden tranzakcióhoz hozzáadott automatikus időbélyeggel tudjuk naplózni.
A parancsnak sikeresen le kell futnia, és nem kap kimenetet:
A ravasz "InsertIntoStudentTrigger” minden alkalommal aktiválódik, amikor új tanulót szúr be a tanulók táblázatába. A "új” kulcsszó a beszúrandó értékekre vonatkozik. Például a „új.StudentId” lesz a beszúrandó diákigazolvány.
Most teszteljük, hogyan viselkedik a trigger, amikor új tanulót szúrunk be.
Step 4) Írja be a következő parancsot, amely új tanulót szúr be a tanulók táblázatába:
INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');
Step 5) Írja be a következő parancsot, amely kijelöli az összes sort a "StudentsLog" asztal:
SELECT * FROM StudentsLog;
Egy új sort kell látnia az imént beszúrt új tanulóhoz:
Ezt a sort az eseményindító szúrta be a 11-es azonosítójú új tanuló beszúrása előtt.
Ebben a példában a triggert használtuk InsertIntoStudentTrigger " hoztuk létre, hogy naplózza a tranzakciókat a táblázatba "StudentsLog” automatikusan. Ugyanígy naplózhat bármilyen frissítést vagy törölhet kijelentéseket.
A nem kívánt frissítések megelőzése triggerekkel:
A BEFORE UPDATE eseményindítók használatával egy táblán megakadályozhatja, hogy egy oszlopban a frissítési utasítások egy kifejezésen alapuljanak.
Példa
A következő példában megakadályozzuk, hogy minden frissítési utasítás frissítse a Diákok táblázat „tanulónév” oszlopát:
Step 1) Navigáljon a „könyvtárba”C:\sqlite” és futtassa az sqlite3.exe fájlt.
Step 2) Nyissa meg az adatbázist "TutorialsSampleDB.db” a következő parancs futtatásával:
.open TutorialsSampleDB.db
Step 3) Hozzon létre egy új triggert "preventUpdateStudentName" az asztalon "Diákok” a következő parancs futtatásával
CREATE TRIGGER preventUpdateStudentName BEFORE UPDATE OF StudentName ON Students FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'You cannot update studentname'); END;
AzEMEL" parancs hibát jelez egy hibaüzenettel " A tanuló nevét nem frissítheti ", és akkor megakadályozza a frissítési utasítás végrehajtását.
Most ellenőrizni fogjuk, hogy a trigger jól működik-e, és megakadályozza a diáknév oszlop frissítését.
Step 4) Futtassa a következő frissítési parancsot, amely frissíti a tanuló nevét "csatlakozó" lenni "Jack1".
UPDATE Students SET StudentName = 'Jack1' WHERE StudentName = 'Jack';
Meg kell kapnia a triggerben megadott hibaüzenetet, amely szerint "A tanuló nevét nem frissítheti” a következőképpen:
Step 5) Futtassa a következő parancsot, amely kiválasztja a tanulók nevének listáját a tanulók táblázatából.
SELECT StudentName FROM Students;
Látnia kell, hogy a „Jack” tanuló neve továbbra is ugyanaz, és nem változik:
Összegzésként
A nézetek, indexek és triggerek nagyon hatékony eszközök egy SQLite adatbázis. Nyomon követheti az adatmódosítási műveleteket, amikor azok egy táblán történnek. Az adatbázis adatlekérési műveletét indexek létrehozásával is optimalizálhatja.