SQLite Örnekle Tetikleyici, Görünümler ve Dizin
Günlük kullanımda SQLiteveritabanınız üzerinde bazı yönetim araçlarına ihtiyacınız olacak. Bunları, dizinler oluşturarak veritabanını sorgulamayı daha verimli hale getirmek veya görünümler oluşturarak daha yeniden kullanılabilir hale getirmek için de kullanabilirsiniz.
SQLite Görüntüle
Görünümler tablolara çok benzer. Ancak Görünümler mantıksal tablolardır; tablolar gibi fiziksel olarak depolanmazlar. Bir görünüm bir select ifadesinden oluşur.
Karmaşık sorgularınız için bir görünüm tanımlayabilir ve sorguları tekrar yazmak yerine istediğiniz zaman görünümü doğrudan çağırarak bu sorguları yeniden kullanabilirsiniz.
CREATE VIEW ifadesi
Bir veritabanında görünüm oluşturmak için CREATE VIEW ifadesini ve ardından görünüm adını kullanabilir ve ardından istediğiniz sorguyu girebilirsiniz.
Örnek: Aşağıdaki örnekte "adında bir Görünüm oluşturacağızTümÖğrencilerGörüntüle“örnek veritabanında”ÖğreticilerSampleDB.db” aşağıdaki gibi:
) 1 Adım Bilgisayarım'ı açın ve şu dizine gidin:C:\sqlite”ve ardından” açınsqlite3.exe":
) 2 Adım Veritabanını aç “ÖğreticilerSampleDB.db” aşağıdaki komutla:
) 3 Adım Aşağıda Görünümü oluşturmak için sqlite3 komutunun temel sözdizimi verilmiştir
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;
Komuttan şu şekilde bir çıktı olmamalıdır:
) 4 Adım Görünümün oluşturulduğundan emin olmak için, aşağıdaki komutu çalıştırarak veritabanındaki görünüm listesini seçebilirsiniz:
SELECT name FROM sqlite_master WHERE type = 'view';
Manzarayı görmelisiniz”TümÖğrencilerGörüntüle" Geri döndü:
) 5 Adım Artık görünümümüz oluşturuldu, bunu normal bir tablo olarak şunun gibi kullanabilirsiniz:
SELECT * FROM AllStudentsView;
Bu komut, aşağıdaki ekran görüntüsünde gösterildiği gibi “AllStudents” görünümünü sorgulayacak ve içindeki tüm satırları seçecektir:
Geçici Görünümler
Geçici görünümler, onu oluşturmak için kullanılan geçerli veritabanı bağlantısı için geçicidir. Daha sonra veritabanı bağlantısını kapatırsanız tüm geçici görünümler otomatik olarak silinir. Geçici görünümler aşağıdaki komutlardan biri kullanılarak oluşturulur:
- SICAKLIK GÖRÜNÜMÜ OLUŞTURUN veya
- GEÇİCİ GÖRÜNÜM OLUŞTURUN.
O an için bazı işlemler yapmak istiyorsanız ve bunun kalıcı bir görünüm olmasına gerek duymuyorsanız, geçici görünümler kullanışlıdır. Yani, yalnızca geçici bir görünüm oluşturursunuz, ardından işleminizi bu görünümü kullanarak yaparsınız. Later veritabanıyla bağlantıyı kapattığınızda otomatik olarak silinecektir.
Örnek:
Aşağıdaki örnekte bir veritabanı bağlantısı açacağız, ardından geçici bir görünüm oluşturacağız.
Bundan sonra o bağlantıyı kapatacağız ve geçici görünümün hala mevcut olup olmadığını kontrol edeceğiz.
) 1 Adım Sqlite3.exe'yi “dizinden açın”C:\sqlite” daha önce açıklandığı gibi.
) 2 Adım Veritabanına bir bağlantı açın “ÖğreticilerSampleDB.dbAşağıdaki komutu çalıştırarak:
.open TutorialsSampleDB.db
) 3 Adım Geçici bir görünüm oluşturacak olan aşağıdaki komutu yazın:TümÖğrencilerTempView'
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;
) 4 Adım Geçici görünümün olduğundan emin olun "TümÖğrencilerTempView” aşağıdaki komutu çalıştırarak oluşturulur:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
) 5 Adım Sqlite3.exe'yi kapatın ve tekrar açın.
) 6 Adım Veritabanına bir bağlantı açın “ÖğreticilerSampleDB.db” aşağıdaki komutla:
.open TutorialsSampleDB.db
) 7 Adım Veritabanında oluşturulan geçici görünümlerin listesini almak için aşağıdaki komutu çalıştırın:
SELECT name FROM sqlite_temp_master WHERE type = 'view';
Önceki adımda veritabanı bağlantısını kapattığımızda oluşturduğumuz geçici görünüm silindiği için herhangi bir çıktı görmemelisiniz. Aksi takdirde, veritabanıyla bağlantıyı açık tuttuğunuz sürece verilerle geçici görünümü görebileceksiniz.
Notlar:
- Görünümlerle birlikte INSERT, DELETE veya UPDATE ifadelerini kullanamazsınız; yalnızca CREATE View örneğinde adım 5'te gösterildiği gibi “görünümlerden seç” komutunu kullanabilirsiniz.
- Bir GÖRÜNÜMÜ silmek için “DROP VIEW” ifadesini kullanabilirsiniz:
DROP VIEW AllStudentsView;
Görünümün silindiğinden emin olmak için, veritabanındaki görünümlerin listesini veren aşağıdaki komutu çalıştırabilirsiniz:
SELECT name FROM sqlite_master WHERE type = 'view';
Aşağıdaki gibi, görünüm silindiği için hiçbir görünümün geri dönmediğini göreceksiniz:
SQLite indeks
Bir kitabınız varsa ve o kitapla ilgili bir anahtar kelime aramak istiyorsanız. Bu anahtar kelimeyi kitabın dizininde arayacaksınız. Daha sonra, söz konusu anahtar kelime hakkında daha fazla bilgi okumak için söz konusu anahtar kelimenin sayfa numarasına gideceksiniz.
Ancak, o kitapta bir dizin veya sayfa numarası yoksa, aradığınız anahtar kelimeyi bulana kadar tüm kitabı baştan sona tarayacaksınız. Ve bu özellikle bir dizininiz ve anahtar kelimeyi aramak için çok yavaş bir süreciniz olduğunda çok zordur.
Dizinler SQLite (ve aynı kavram diğerleri için de geçerlidir) Veritabanı Yönetim Sistemleri de) kitapların arkasında bulunan indekslerle aynı şekilde çalışır.
Bir dizideki bazı satırları aradığınızda SQLite arama kriterlerini içeren tablo, SQLite aradığınız kriterlerle eşleşen satırları bulana kadar tablonun tüm satırlarında arama yapacaktır. Ve daha büyük masalarınız olduğunda bu süreç çok yavaşlar.
Dizinler veri arama sorgularını hızlandıracak ve tablolardan veri alımının gerçekleştirilmesine yardımcı olacaktır. İndeksler tablo sütunlarında tanımlanır.
Dizinlerle performansı artırma:
Dizinler bir tabloda veri arama performansını iyileştirebilir. Bir sütunda bir dizin oluşturduğunuzda, SQLite her alan değerinin, değerin ait olduğu tüm satırı gösteren bir işaretçiye sahip olduğu dizin için bir veri yapısı oluşturacaktır.
Daha sonra, bir dizinin parçası olan bir sütunda arama koşulu içeren bir sorgu çalıştırırsanız, SQLite önce indeksteki değeri arayacaktır. SQLite bunun için tüm tabloyu taramayacağız. Daha sonra tablo satırı için değerin işaret ettiği konumu okuyacaktır. SQLite o konumdaki satırı bulacak ve alacaktır.
Ancak aradığınız sütun bir dizinin parçası değilse, SQLite aradığınız veriyi bulmak için sütun değerlerine yönelik bir tarama gerçekleştirecektir. Dizin yoksa genellikle daha yavaş bir süreç olacaktır.
İçinde dizin bulunmayan bir kitap düşünün ve belirli bir kelimeyi aramanız gerekiyor. O kelimeyi arayarak kitabın tamamını ilk sayfasından son sayfasına kadar tarayacaksınız. Ancak o kitapta bir indeks varsa, önce içindeki kelimeyi arayacaksınız. Bulunduğu sayfa numarasını alın ve ardından ona gidin. Bu, kitabın tamamını kapaktan kapağa taramaktan çok daha hızlı olacaktır.
SQLite ENDEKS OLUŞTUR
Bir sütun üzerinde indeks oluşturmak için CREATE INDEX komutunu kullanmalısınız. Ve bunu şu şekilde tanımlamanız gerekir:
- CREATE INDEX komutundan sonra indeksin ismini belirtmeniz gerekmektedir.
- İndeks adından sonra “ON” anahtar kelimesini ve ardından indeksin oluşturulacağı tablo adını yazmalısınız.
- Daha sonra dizin için kullanılan sütun adlarının listesi.
- Dizin verilerini sıralamak için kullanılan sıralama düzenini belirtmek amacıyla herhangi bir sütun adından sonra “ASC” veya “DESC” anahtar sözcüklerinden birini kullanabilirsiniz.
Örnek:
Aşağıdaki örnekte bir dizin oluşturacağız “ÖğrenciAdı Dizini"öğrenci masasında"Öğrenciler” veritabanı şu şekildedir:
) 1 Adım “Klasöre gidinC:\sqlite” daha önce açıklandığı gibi.
) 2 Adım Sqlite3.exe'yi açın.
) 3 Adım Veritabanını aç “ÖğreticilerSampleDB.db” aşağıdaki komutla:
.open TutorialsSampleDB.db
) 4 Adım Yeni bir dizin oluştur "ÖğrenciAdıIndexAşağıdaki komutu kullanarak:
CREATE INDEX StudentNameIndex ON Students(StudentName);
Bunun için hiçbir çıktı görmemelisiniz:
) 5 Adım Dizinin oluşturulduğundan emin olmak için Students tablosunda oluşturulan dizinlerin listesini veren aşağıdaki sorguyu çalıştırabilirsiniz:
PRAGMA index_list(Students);
Yeni oluşturduğumuz dizinin döndürüldüğünü görmelisiniz:
Notlar:
- Dizinler yalnızca sütunlara göre değil ifadelere göre de oluşturulabilir. Bunun gibi bir şey:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);
“OrderTotalIndex”, OrderId sütununa ve ayrıca Quantity sütun değeri ile Fiyat sütun değerinin çarpımına dayanacaktır. Dolayısıyla, "Sipariş Kimliği" ve "Miktar*Fiyat" için herhangi bir sorgu, sorgu dizini kullanacağından etkili olacaktır.
- CREATE INDEX ifadesinde bir WHERE ifadesi belirttiyseniz, dizin kısmi bir dizin olacaktır. Bu durumda, dizinde yalnızca WHERE ifadesindeki koşullarla eşleşen satırlar için girişler olacaktır. Örneğin, aşağıdaki dizinde:
CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price) WHERE Quantity > 10000;
(Yukarıdaki örnekte WHERE deyimi belirtildiği için endeks kısmi endeks olacaktır. Bu durumda endeks yalnızca miktar değeri 10000'den büyük olan emirlere uygulanacaktır. Bu endekse kısmi endeks adı verildiğini unutmayın. Üzerinde kullanılan ifadeden değil, WHERE deyiminden dolayı indeksleyebilirsiniz. Ancak ifadeleri normal indekslerle kullanabilirsiniz.)
- Sütunlara çift giriş yapılmasını önlemek için CREATE INDEX yerine CREATE UNIQUE INDEX deyimini kullanabilirsiniz ve böylece indekslenen sütunun tüm değerleri benzersiz olacaktır.
- Bir dizini silmek için DROP INDEX komutunu ve ardından silinecek dizin adını kullanın.
SQLite Tetik
Giriş SQLite Tetik
Tetikleyiciler, bir veritabanı tablosunda belirli bir eylem gerçekleştiğinde yürütülen otomatik önceden tanımlanmış işlemlerdir. Bir tetikleyici, bir tabloda aşağıdaki eylemlerden biri gerçekleştiğinde tetiklenecek şekilde tanımlanabilir:
- Bir tabloya INSERT.
- Bir tablodaki satırları SİLİN.
- Tablo sütunlarından birini GÜNCELLEYİN.
SQLite FOR EACH ROW tetikleyicisini destekler, böylece tetikleyicideki önceden tanımlanmış işlemler, tabloda gerçekleşen eylemlerde (ister ekleme, silme, ister güncelleme olsun) yer alan tüm satırlar için yürütülür.
SQLite TETİKLEYİCİ OLUŞTUR
Yeni bir TRIGGER oluşturmak için CREATE TRIGGER ifadesini aşağıdaki gibi kullanabilirsiniz:
- CREATE TRIGGER'dan sonra bir tetikleyici adı belirtmelisiniz.
- Tetikleyici adından sonra, tetikleyici adının tam olarak ne zaman yürütülmesi gerektiğini belirtmeniz gerekir. Üç seçeneğiniz var:
- BEFORE – tetikleyici, belirtilen INSERT, UPDATE veya delete ifadesinden önce yürütülür.
- Sonra – tetikleyici, belirtilen INSERT, UPDATE veya delete ifadesinden sonra yürütülür.
- YERİNE – Tetiği tetikleyen gerçekleşen eylemi, TRIGGER'da belirtilen ifadeyle değiştirecektir. INSTEAD OF tetikleyicisi tablolar için geçerli değildir, yalnızca görünümler için geçerlidir.
Tetikleyiciler yalnızca create tetikleyici komutunda belirtilen ifadenin türüne bağlı olarak etkinleştirilecektir (ateşlenecektir). Örneğin:
- BEFORE INSERT tetikleyicisi herhangi bir ekleme ifadesinden önce etkinleştirilecektir (ateşlenecektir).
- AFTER UPDATE tetikleyicisi herhangi bir güncelleme bildiriminden sonra etkinleştirilecektir (ateşlenecektir), vb.
Tetikleyicinin içinde, yeni eklenen değerlere "new" anahtar sözcüğünü kullanarak başvurabilirsiniz. Ayrıca, silinen veya güncellenen değerlere old anahtar sözcüğünü kullanarak başvurabilirsiniz. Aşağıdaki gibi:
- INSERT tetikleyicilerinin içinde – yeni anahtar kelime kullanılabilir.
- UPDATE tetikleyicilerinin içinde – yeni ve eski anahtar kelimeler kullanılabilir.
- DELETE tetikleyicilerinin içinde – eski anahtar kelime kullanılabilir.
Örnek E-posta
Aşağıda, ""'a yeni bir öğrenci eklemeden önce tetiklenecek bir tetikleyici oluşturacağız.Öğrenciler”Tablosu.
Yeni eklenen öğrenciyi tabloya kaydedecektir”Öğrenci Günlüğü” insert ifadesinin gerçekleştiği geçerli tarih ve saat için otomatik bir zaman damgası ile. Aşağıdaki gibi:
) 1 Adım “dizine gidinC:\sqlite”ve sqlite3.exe'yi çalıştırın.
) 2 Adım Veritabanını aç “ÖğreticilerSampleDB.dbAşağıdaki komutu çalıştırarak:
.open TutorialsSampleDB.db
) 3 Adım tetikleyiciyi oluştur "InsertIntoStudentTriggerAşağıdaki komutu çalıştırarak:
CREATE TRIGGER InsertIntoStudentTrigger BEFORE INSERT ON Students BEGIN INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert'); END;
Bu fonksiyon “tarihsaat()” insert ifadesi gerçekleştiğinde size geçerli tarih ve saat damgasını verecektir. Böylece ekleme işlemini her işleme eklenen otomatik zaman damgalarıyla kaydedebiliriz.
Komut başarıyla çalışmalı ve çıktı alamazsınız:
Tetik "InsertIntoStudentTrigger” öğrenci tablosuna her yeni öğrenci eklediğinizde ateşlenecektir. “yeni” anahtar kelimesi eklenecek değerleri ifade eder. Örneğin, “yeni.ÖğrenciKimliği” eklenecek öğrenci kimliği olacaktır.
Şimdi yeni bir öğrenci eklediğimizde tetikleyicinin nasıl davrandığını test edeceğiz.
) 4 Adım Students tablosuna yeni bir öğrenci ekleyecek aşağıdaki komutu yazın:
INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');
) 5 Adım "" satırındaki tüm satırları seçecek aşağıdaki komutu yazın.Öğrenci Günlüğü" masa:
SELECT * FROM StudentsLog;
Az önce eklediğimiz yeni öğrenci için yeni bir satırın döndürüldüğünü görmelisiniz:
Bu satır, kimliği 11 olan yeni öğrenciyi eklemeden önce tetikleyici tarafından eklendi.
Bu örnekte tetikleyiciyi kullandık “ InsertIntoStudentTrigger “Tabloya herhangi bir ekleme işleminin kaydedilmesi için oluşturduk”Öğrenci Günlüğü” otomatik olarak. Aynı şekilde herhangi bir güncellemeyi günlüğe kaydedebilir veya ifadeleri silebilirsiniz.
Tetikleyicilerle istenmeyen güncellemelerin önlenmesi:
Bir tablodaki BEFORE UPDATE tetikleyicilerini kullanarak, bir ifadeye dayalı bir sütundaki güncelleme ifadelerinin engellenmesini sağlayabilirsiniz.
Örnek E-posta
Aşağıdaki örnekte, Students tablosundaki “studentname” sütununu herhangi bir güncelleme ifadesinin güncellemesini önleyeceğiz:
) 1 Adım “dizine gidinC:\sqlite”ve sqlite3.exe'yi çalıştırın.
) 2 Adım Veritabanını aç “ÖğreticilerSampleDB.dbAşağıdaki komutu çalıştırarak:
.open TutorialsSampleDB.db
) 3 Adım Yeni bir tetikleyici oluştur "Güncellemeyi önlemekÖğrenciAdı" masanın üstünde "ÖğrencilerAşağıdaki komutu çalıştırarak
CREATE TRIGGER preventUpdateStudentName BEFORE UPDATE OF StudentName ON Students FOR EACH ROW BEGIN SELECT RAISE(ABORT, 'You cannot update studentname'); END;
"YÜKSELTMEK” komutu bir hata mesajıyla birlikte bir hata ortaya çıkaracaktır “ Öğrenci adını güncelleyemezsiniz “ve ardından güncelleme ifadesinin yürütülmesini engelleyecektir.
Şimdi tetikleyicinin iyi çalıştığını ve öğrenci adı sütununda herhangi bir güncelleme yapılmasını önlediğini doğrulayacağız.
) 4 Adım Öğrenci adını güncelleyecek olan aşağıdaki güncelleme komutunu çalıştırın:kriko" olmak "Jack1".
UPDATE Students SET StudentName = 'Jack1' WHERE StudentName = 'Jack';
Tetikleyicide belirttiğimiz hata mesajını almalısınız: “Öğrenci adını güncelleyemezsiniz” aşağıdaki gibi:
) 5 Adım Öğrenciler tablosundan öğrencilerin isimlerinin listesini seçecek olan aşağıdaki komutu çalıştırın.
SELECT StudentName FROM Students;
Öğrenci adının “Jack”in hala aynı olduğunu ve değişmediğini görmelisiniz:
ÖZET
Görünümler, Dizinler ve Tetikleyiciler bir yönetimi yönetmek için çok güçlü araçlardır. SQLite veritabanı. Veri değiştirme işlemlerini bir tabloda gerçekleştiğinde takip edebilirsiniz. Ayrıca dizinler oluşturarak veritabanı veri alma işlemini optimize edebilirsiniz.