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":

SQLite Görüntüle

) 2 Adım Veritabanını aç “ÖğreticilerSampleDB.db” aşağıdaki komutla:

SQLite Görüntüle

) 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:

SQLite Görüntüle

) 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ü:

SQLite Görüntüle

) 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:

SQLite Görüntüle

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;

SQLite Görüntüle

) 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';

SQLite Görüntüle

) 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.

SQLite Görüntüle

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 Görüntüle

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:

SQLite indeks

) 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:

SQLite indeks

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.
  • Daha sonra eylemin türünü belirtmeniz gerekir; eylem gerçekleştiğinde tetikleyici etkinleşecektir. SİL, EKLE veya GÜNCELLE.
  • Eylem söz konusu sütunda gerçekleşmediği sürece tetikleyicinin etkinleşmemesi için isteğe bağlı bir sütun adı seçebilirsiniz.
  • Daha sonra tetikleyicinin oluşturulacağı tablo adını belirtmeniz gerekir.
  • Tetikleyicinin gövdesinin içinde, tetikleyici tetiklendiğinde her satır için yürütülmesi gereken ifadeyi belirtmelisiniz.
  • 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:

    SQLite Tetik

    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:

    SQLite Tetik

    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:

    SQLite Tetik

    ) 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:

    SQLite Tetik

    Ö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.