SQLite Trigger, visualizzazioni e indice con esempio

Nell'uso quotidiano di SQLite, avrai bisogno di alcuni strumenti amministrativi sul tuo database. รˆ inoltre possibile utilizzarli per eseguire query sul database in modo piรน efficiente creando indici o piรน riutilizzabili creando visualizzazioni.

SQLite Visualizzare

Le viste sono molto simili alle tabelle. Ma le viste sono tabelle logiche; non vengono archiviati fisicamente come le tabelle. Una vista รจ composta da un'istruzione select.

Puoi definire una vista per le tue query complesse e riutilizzarle ogni volta che vuoi chiamando direttamente la vista anzichรฉ riscrivere nuovamente le query.

Istruzione CREATE VIEW

Per creare una vista su un database, puoi utilizzare l'istruzione CREATE VIEW seguita dal nome della vista, quindi inserire la query desiderata.

Esempio: Nell'esempio seguente creeremo una vista con il nome "Tutti gli studenti Visualizza"nel database di esempio"TutorialSampleDB.db" come segue:

Passo 1) Aprire Risorse del computer e andare alla seguente directory โ€œC:\sqlite" e poi apri "sqlite3.exe"

SQLite Visualizzare

Passo 2) Apri la banca datiโ€TutorialSampleDB.db" con il seguente comando:

SQLite Visualizzare

Passo 3) Di seguito รจ riportata una sintassi di base del comando sqlite3 per creare la vista

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;

Non dovrebbe esserci alcun output dal comando come questo:

SQLite Visualizzare

Passo 4) Per garantire che la vista venga creata, รจ possibile selezionare l'elenco delle viste nel database eseguendo il seguente comando:

SELECT name FROM sqlite_master WHERE type = 'view';

Dovresti vedere la vista "Tutti gli studenti Visualizza" viene restituito:

SQLite Visualizzare

Passo 5) Ora che la nostra vista รจ stata creata, puoi usarla come una normale tabella in questo modo:

SELECT * FROM AllStudentsView;

Questo comando interrogherร  la vista โ€œAllStudentsโ€ e selezionerร  tutte le righe da essa come mostrato nello screenshot seguente:

SQLite Visualizzare

Viste temporanee

Le viste temporanee sono temporanee per la connessione al database corrente utilizzata per crearla. Quindi, se si chiude la connessione al database, tutte le viste temporanee verranno eliminate automaticamente. Le viste temporanee vengono create utilizzando uno dei seguenti comandi:

  • CREA VISUALIZZAZIONE TEMPORANEA, o
  • CREA VISTA TEMPORANEA.

Le viste temporanee sono utili se vuoi eseguire alcune operazioni per il momento e non รจ necessario che siano una vista permanente. Quindi, crei semplicemente una vista temporanea, quindi esegui l'elaborazione utilizzando quella vista. Later quando chiudi la connessione con il database, verrร  eliminato automaticamente.

Esempio:

Nell'esempio seguente, apriremo una connessione al database e poi creeremo una vista temporanea.

Successivamente, chiuderemo la connessione e controlleremo se la vista temporanea esiste ancora o meno.

Passo 1) Apri sqlite3.exe dalla directory โ€œC:\sqlite"come spiegato prima.

Passo 2) Aprire una connessione al database โ€œTutorialSampleDB.db" eseguendo il seguente comando:

.open TutorialsSampleDB.db

Passo 3) Scrivi il seguente comando che creerร  una vista temporanea "TuttiStudentiTempView":

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 Visualizzare

Passo 4) Assicurarsi che la visualizzazione temporanea โ€œTuttiStudentiTempView" viene creato eseguendo il seguente comando:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

SQLite Visualizzare

Passo 5) Chiudi sqlite3.exe e aprilo di nuovo.

Passo 6) Aprire una connessione al database โ€œTutorialSampleDB.db" con il seguente comando:

.open TutorialsSampleDB.db

Passo 7) Eseguire il seguente comando per ottenere l'elenco delle viste temporanee create sul database:

SELECT name FROM sqlite_temp_master WHERE type = 'view';

Non dovresti vedere alcun output, poichรฉ la vista temporanea che abbiamo creato รจ stata eliminata quando abbiamo chiuso la connessione al database nel passaggio precedente. Altrimenti, finchรฉ mantieni aperta la connessione con il database, sarai in grado di vedere la vista temporanea con i dati.

SQLite Visualizzare

Note:

  • Non รจ possibile utilizzare le istruzioni INSERT, DELETE o UPDATE con le viste, solo รจ possibile utilizzare il comando "seleziona dalle viste" come mostrato nel passaggio 5 nell'esempio CREATE View.
  • Per eliminare una VIEW, รจ possibile utilizzare l'istruzione "DROP VIEW":
DROP VIEW AllStudentsView;

Per assicurarti che la vista venga eliminata, puoi eseguire il seguente comando che ti fornirร  l'elenco delle viste nel database:

SELECT name FROM sqlite_master WHERE type = 'view';

Non troverai alcuna visualizzazione restituita poichรฉ la visualizzazione รจ stata eliminata, come segue:

SQLite Visualizzare

SQLite Indice

Se hai un libro e desideri cercare una parola chiave su quel libro. Cercherai quella parola chiave nell'indice del libro. Quindi passerai al numero di pagina relativo a quella parola chiave per leggere ulteriori informazioni su quella parola chiave.

Tuttavia, se non c'รจ un indice su quel libro nรฉ numeri di pagina, scannerizzerai l'intero libro dall'inizio alla fine finchรฉ non trovi la parola chiave che stai cercando. E questo รจ molto difficile, specialmente quando hai un indice e un processo molto lento per cercare una parola chiave.

Indici dentro SQLite (e lo stesso concetto vale per other sistemi di gestione di database (anche) funziona allo stesso modo degli indici che si trovano sul retro dei libri.

Quando cerchi alcune righe in un file SQLite tabella con criteri di ricerca, SQLite cercherร  in tutte le righe della tabella finchรฉ non troverร  le righe che stai cercando che corrispondono ai criteri di ricerca. E questo processo diventa molto lento quando si hanno tabelle piรน grandi.

Gli indici velocizzeranno le query di ricerca dei dati e aiuteranno a eseguire il recupero dei dati dalle tabelle. Gli indici sono definiti nelle colonne della tabella.

Miglioramento delle prestazioni con gli indici:

Gli indici possono migliorare le prestazioni della ricerca di dati in una tabella. Quando crei un indice su una colonna, SQLite creerร  una struttura dati per quell'indice in cui ogni valore di campo ha un puntatore all'intera riga a cui appartiene il valore.

Quindi, se esegui una query con una condizione di ricerca su una colonna che fa parte di un indice, SQLite cercherร  prima il valore sull'indice. SQLite non scansionerร  l'intera tabella per questo. Quindi leggerร  la posizione in cui punta il valore per la riga della tabella. SQLite individuerร  la riga in quella posizione e la recupererร .

Tuttavia, se la colonna che stai cercando non fa parte di un indice, SQLite eseguirร  una scansione dei valori delle colonne per trovare i dati che stai cercando. Di solito il processo sarร  piรน lento se non รจ presente alcun indice.

Immagina un libro senza indice e devi cercare una parola specifica. Scansionerai l'intero libro dalla prima all'ultima pagina cercando quella parola. Tuttavia, se hai un indice su quel libro, cercherai prima la parola su di esso. Ottieni il numero di pagina in cui si trova, quindi raggiungilo. Il che sarร  molto piรน veloce che scansionare l'intero libro da copertina a copertina.

SQLite CREA INDICE

Per creare un indice su una colonna, dovresti usare il comando CREATE INDEX. E dovresti definirlo come segue:

  • รˆ necessario specificare il nome dell'indice dopo il comando CREATE INDEX.
  • Dopo il nome dell'indice bisogna mettere la parola chiave โ€œONโ€, seguita dal nome della tabella in cui verrร  creato l'indice.
  • Quindi l'elenco dei nomi di colonna utilizzati per l'indice.
  • รˆ possibile utilizzare una delle seguenti parole chiave "ASC" o "DESC" dopo qualsiasi nome di colonna per specificare un criterio di ordinamento utilizzato per ordinare i dati dell'indice.

Esempio:

Nell'esempio seguente creeremo un indice โ€œIndiceNomeStudente" sul tavolo degli studenti nella sezione "Gli studenti"database come segue:

Passo 1) Passare alla cartella โ€œC:\sqlite"come spiegato prima.

Passo 2) Apri sqlite3.exe.

Passo 3) Apri la banca datiโ€TutorialSampleDB.db" con il seguente comando:

.open TutorialsSampleDB.db

Passo 4) Crea un nuovo indice โ€œStudentNameIndice" utilizzando il seguente comando:

CREATE INDEX StudentNameIndex ON Students(StudentName);

Non dovresti vedere alcun output per questo:

SQLite Indice

Passo 5) Per assicurarti che l'indice sia stato creato, puoi eseguire la seguente query, che ti fornirร  l'elenco degli indici creati nella tabella Studenti:

PRAGMA index_list(Students);

Dovresti vedere restituito l'indice che abbiamo appena creato:

SQLite Indice

Note:

  • Gli indici possono essere creati non solo in base alle colonne ma anche alle espressioni. Qualcosa come questo:
CREATE INDEX OrderTotalIndex ON OrderItems(OrderId, Quantity*Price);

Il valore "OrderTotalIndex" sarร  basato sulla colonna OrderId e anche sulla moltiplicazione del valore della colonna Quantitร  e del valore della colonna Prezzo. Pertanto, qualsiasi query per "OrderId" e "Quantity*Price" sarร  efficiente poichรฉ utilizzerร  l'indice.

  • Se hai specificato una clausola WHERE nell'istruzione CREATE INDEX, l'indice sarร  un indice parziale. In questo caso, ci saranno voci nell'indice solo per le righe che corrispondono alle condizioni nella clausola WHERE. Ad esempio, nel seguente indice:
    CREATE INDEX OrderTotalIndexForLargeQuantities ON OrderItems(OrderId, Quantity*Price)
    WHERE Quantity > 10000;

    (Nell'esempio precedente, l'indice sarร  un indice parziale poichรฉ รจ specificata una clausola WHERE. In questo caso, l'indice verrร  applicato solo a quegli ordini con un valore di quantitร  maggiore di 10000. Si noti che questo indice รจ chiamato parziale indice a causa della clausola WHERE, non dell'espressione utilizzata al suo interno. Tuttavia, รจ possibile utilizzare le espressioni con indici normali.)

  • รˆ possibile utilizzare l'istruzione CREATE UNIQUE INDEX invece di CREATE INDEX per evitare voci duplicate per le colonne e quindi tutti i valori per la colonna indicizzata saranno univoci.
  • Per eliminare un indice, utilizzare il comando DROP INDEX seguito dal nome dell'indice da eliminare.

SQLite grilletto

Introduzione alla SQLite grilletto

I trigger sono operazioni automatiche predefinite eseguite quando si verifica un'azione specifica su una tabella di database. Un trigger puรฒ essere definito in modo che venga attivato ogni volta che si verifica una delle seguenti azioni su una tabella:

  • INSERIRE in una tabella.
  • ELIMINA righe da una tabella.
  • AGGIORNA una delle colonne della tabella.

SQLite supporta il trigger FOR EACH ROW in modo che le operazioni predefinite nel trigger vengano eseguite per tutte le righe coinvolte nelle azioni eseguite sulla tabella (siano esse inserimento, eliminazione o aggiornamento).

SQLite CREARE TRIGGER

Per creare un nuovo TRIGGER, รจ possibile utilizzare l'istruzione CREATE TRIGGER come segue:

  • Dopo CREATE TRIGGER, dovresti specificare un nome di trigger.
  • Dopo il nome del trigger รจ necessario specificare quando esattamente il nome del trigger deve essere eseguito. Hai tre opzioni:
  • BEFORE โ€“ il trigger verrร  eseguito prima dell'istruzione INSERT, UPDATE o delete specificata.
  • After: il trigger verrร  eseguito dopo l'istruzione INSERT, UPDATE o delete specificata.
  • INVECE DI โ€“ Sostituirร  l'azione avvenuta che ha attivato il trigger con l'istruzione specificata nel TRIGGER. Il trigger INSTEAD OF non รจ applicabile alle tabelle, solo alle viste.
  • Quindi, devi specificare il tipo di azione, il trigger si attiverร  quando accade. ELIMINA, INSERISCI o AGGIORNA.
  • Puoi scegliere un nome di colonna facoltativo in modo che l'attivatore non venga attivato a meno che l'azione non sia avvenuta su quella colonna.
  • Quindi devi specificare il nome della tabella in cui verrร  creato il trigger.
  • All'interno del corpo del trigger, dovresti specificare l'istruzione che dovrebbe essere eseguita per ogni riga quando viene attivato il trigger.
  • I trigger verranno attivati โ€‹โ€‹(attivati) solo in base al tipo di istruzione specificata nel comando create trigger. Per esempio:

    • Il trigger BEFORE INSERT verrร  attivato (attivato) prima di qualsiasi istruzione di inserimento.
    • Il trigger AFTER UPDATE verrร  attivato (attivato) dopo qualsiasi istruzione di aggiornamento, ... e cosรฌ via.

    All'interno del trigger, puoi fare riferimento ai valori appena inseriti usando la parola chiave "new". Inoltre, puoi fare riferimento ai valori eliminati o aggiornati usando la parola chiave old. Come segue:

    • All'interno dei trigger INSERT: รจ possibile utilizzare una nuova parola chiave.
    • All'interno dei trigger UPDATE: รจ possibile utilizzare parole chiave nuove e vecchie.
    • All'interno dei trigger DELETE: รจ possibile utilizzare la vecchia parola chiave.

    Esempio

    Di seguito creeremo un trigger che verrร  attivato prima di inserire un nuovo studente nel "Gli studenti" tavolo.

    Verrร  registrato nella tabella lo studente appena inseritoโ€Registro degli studenti" con un timestamp automatico per la data e l'ora correnti in cui รจ avvenuta l'istruzione insert. Come segue:

    Passo 1) Passare alla directory โ€œC:\sqlite" ed esegui sqlite3.exe.

    Passo 2) Apri la banca datiโ€TutorialSampleDB.db" eseguendo il seguente comando:

    .open TutorialsSampleDB.db

    Passo 3) creare il triggerโ€InserisciIntoStudentTrigger"Eseguendo il seguente comando:

    CREATE TRIGGER InsertIntoStudentTrigger 
           BEFORE INSERT ON Students
    BEGIN
      INSERT INTO StudentsLog VALUES(new.StudentId, datetime(), 'Insert');
    END;

    La funzione "appuntamento()" ti fornirร  l'indicazione della data e dell'ora corrente in cui รจ avvenuta l'istruzione di inserimento. In modo da poter registrare la transazione di inserimento con timestamp automatici aggiunti a ciascuna transazione.

    Il comando dovrebbe essere eseguito correttamente e non viene visualizzato alcun output:

    SQLite grilletto

    Il grillettoโ€InserisciIntoStudentTrigger" si attiverร  ogni volta che inserisci un nuovo studente nella tabella degli studenti. IL "new" La parola chiave si riferisce ai valori che verranno inseriti. Ad esempio, il โ€œnuovo.StudentIdโ€ sarร  la matricola studente che verrร  inserita.

    Ora testeremo come si comporta il trigger quando inseriamo un nuovo studente.

    Passo 4) Scrivi il seguente comando che inserirร  un nuovo studente nella tabella degli studenti:

    INSERT INTO Students VALUES(11, 'guru11', 1, '1999-10-12');

    Passo 5) Scrivi il seguente comando che selezionerร  tutte le righe da โ€œRegistro degli studenti" tavolo:

    SELECT * FROM StudentsLog;

    Dovresti vedere una nuova riga restituita per il nuovo studente che abbiamo appena inserito:

    SQLite grilletto

    Questa riga รจ stata inserita dal trigger prima di inserire il nuovo studente con ID 11.

    In questo esempio abbiamo utilizzato il trigger โ€œ InserisciIntoStudentTrigger โ€ abbiamo creato, per registrare eventuali transazioni inserite nella tabella โ€œRegistro degli studenti" automaticamente. Allo stesso modo puoi registrare qualsiasi aggiornamento o eliminare le dichiarazioni.

    Prevenire aggiornamenti involontari con trigger:

    Utilizzando i trigger BEFORE UPDATE su una tabella, รจ possibile impedire le istruzioni di aggiornamento su una colonna in base a un'espressione.

    Esempio

    Nell'esempio seguente, impediremo a qualsiasi istruzione di aggiornamento di aggiornare la colonna "studentname" nella tabella Studenti:

    Passo 1) Passare alla directory โ€œC:\sqlite" ed esegui sqlite3.exe.

    Passo 2) Apri la banca datiโ€TutorialSampleDB.db" eseguendo il seguente comando:

    .open TutorialsSampleDB.db

    Passo 3) Crea un nuovo trigger โ€œpreventUpdateStudentName" sul tavolo "Gli studenti" eseguendo il seguente comando

    CREATE TRIGGER preventUpdateStudentName
    BEFORE UPDATE OF StudentName ON Students
    FOR EACH ROW
    BEGIN
        SELECT RAISE(ABORT, 'You cannot update studentname');
    END;

    Il "AUMENTARE"il comando genererร  un errore con un messaggio di errore" Non puoi aggiornare il nome dello studente ", e quindi impedirร  l'esecuzione dell'istruzione di aggiornamento.

    Ora verificheremo che il trigger funzioni correttamente e impedisca qualsiasi aggiornamento per la colonna nomestudente.

    Passo 4) Esegui il seguente comando di aggiornamento, che aggiornerร  il nome dello studente "Giacca" essere "Jack1".

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

    Dovresti ricevere il messaggio di errore che abbiamo specificato sul trigger, dicendo che "Non puoi aggiornare il nome dello studente" come segue:

    SQLite grilletto

    Passo 5) Eseguire il seguente comando, che selezionerร  l'elenco dei nomi degli studenti dalla tabella degli studenti.

    SELECT StudentName FROM Students;

    Dovresti vedere che il nome dello studente "Jack" รจ sempre lo stesso e non cambia:

    SQLite grilletto

    Sintesi

    Visualizzazioni, indici e trigger sono strumenti molto potenti per amministrare un file SQLite banca dati. Puoi tracรˆ possibile monitorare le operazioni di modifica dei dati quando avvengono su una tabella. รˆ inoltre possibile ottimizzare le operazioni di recupero dei dati dal database creando indici.

    Riassumi questo post con: