SQLite Viste, indici e trigger con esempio

โšก Riepilogo intelligente

SQLite Viste, indici e trigger sono strumenti amministrativi che semplificano l'interrogazione e la manutenzione di un database: le viste riutilizzano query complesse, gli indici velocizzano le ricerche e i trigger eseguono automaticamente azioni predefinite ogni volta che i dati cambiano.

  • ๐Ÿ‘๏ธ Visualizzazioni: Una vista รจ una tabella logica creata a partire da un'istruzione SELECT, che consente di riutilizzare query complesse senza doverle riscrivere.
  • โณ Visualizzazioni temporanee: Le viste temporanee esistono solo per la connessione corrente e vengono eliminate automaticamente una volta chiusa la connessione.
  • โšก Indici: Gli indici funzionano come un indice di un libro, permettendo SQLite individuare rapidamente le righe corrispondenti anzichรฉ scansionare ogni riga della tabella.
  • ๐ŸŽฏ Tipi di indice: SQLite Supporta indici di espressione, parziali e univoci per ottimizzare le prestazioni in base a specifici modelli di query.
  • ๐Ÿ”” trigger: I trigger eseguono automaticamente operazioni predefinite prima o dopo le istruzioni INSERT, UPDATE o DELETE su una tabella.
  • ๐Ÿค– Assistenza AI: Gli strumenti di intelligenza artificiale per la conversione da testo a SQL e GitHub Copilot generano SQLite Visualizzazioni, indici e trigger tramite prompt in linguaggio naturale.

SQLite Trigger, viste e indice

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 "AllStudentsView" nel database di esempio "TutorialsSampleDB.db" come segue:

Passo 1) Apri Risorse del computer e vai alla seguente directory "C:\sqlite", quindi apri "sqlite3.exe":

SQLite Visualizzare

Passo 2) Aprire il database โ€œTutorialsSampleDB.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 che viene restituita la vista "AllStudentsView":

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) Aprire sqlite3.exe dalla directory "C:\sqlite" come spiegato in precedenza.

Passo 2) Apri una connessione al database "TutorialsSampleDB.db" eseguendo il seguente comando:

.open TutorialsSampleDB.db

Passo 3) Scrivi il seguente comando che creerร  una vista temporanea "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;

SQLite Visualizzare

Passo 4) Assicurarsi che la vista temporanea "AllStudentsTempView" venga creata 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) Apri una connessione al database "TutorialsSampleDB.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

Oltre a riutilizzare query complesse con viste, SQLite Inoltre, grazie agli indici, recupera piรน velocemente le righe corrispondenti.

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 "StudentNameIndex" sulla tabella degli studenti nel database "Students" come segue:

Passo 1) Come spiegato in precedenza, accedi alla cartella "C:\sqlite".

Passo 2) Apri sqlite3.exe.

Passo 3) Aprire il database โ€œTutorialsSampleDB.dbโ€ con il seguente comando:

.open TutorialsSampleDB.db

Passo 4) Crea un nuovo indice "StudentNameIndex" 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.

Mentre gli indici rendono le letture piรน veloci, i trigger permettono SQLite Risponde automaticamente ogni volta che i dati cambiano.

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 si attiverร  prima di inserire un nuovo studente nella tabella "Studenti".

Il sistema registrerร  il nuovo studente inserito nella tabella "StudentsLog" con un timestamp automatico corrispondente alla data e all'ora correnti in cui รจ avvenuta l'istruzione di inserimento. Come segue:

Passo 1) Accedere alla directory "C:\sqlite" ed eseguire sqlite3.exe.

Passo 2) Aprire il database โ€œTutorialsSampleDB.dbโ€ eseguendo il seguente comando:

.open TutorialsSampleDB.db

Passo 3) crea il trigger "InsertIntoStudentTrigger" eseguendo il seguente comando:

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

La funzione "datetime()" restituisce la data e l'ora correnti in cui รจ stata eseguita l'istruzione INSERT. In questo modo possiamo registrare la transazione di inserimento con timestamp aggiunti automaticamente a ciascuna transazione.

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

SQLite grilletto

Il trigger "InsertIntoStudentTrigger" si attiverร  ogni volta che si inserisce un nuovo studente nella tabella degli studenti. La parola chiave "new" si riferisce ai valori che verranno inseriti. Ad esempio, "new.StudentId" sarร  l'ID dello studente che verrร  inserito.

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 dalla tabella "StudentsLog":

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 "InsertIntoStudentTrigger" che abbiamo creato, per registrare automaticamente tutte le transazioni di inserimento nella tabella "StudentsLog". Allo stesso modo รจ possibile registrare qualsiasi istruzione di aggiornamento o eliminazione.

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) Accedere alla directory "C:\sqlite" ed eseguire sqlite3.exe.

Passo 2) Aprire il database โ€œTutorialsSampleDB.dbโ€ eseguendo il seguente comando:

.open TutorialsSampleDB.db

Passo 3) Crea un nuovo trigger "preventUpdateStudentName" sulla tabella "Students" 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 comando "RAISE" genererร  un errore con il messaggio "Non รจ possibile aggiornare studentname" e impedirร  l'esecuzione dell'istruzione di aggiornamento.

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

Passo 4) Eseguire il seguente comando di aggiornamento, che aggiornerร  il nome dello studente "Jack" in "Jack1".

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

Dovresti ricevere il messaggio di errore specificato nel trigger, che indica "Non รจ possibile aggiornare studentname", 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

DOMANDE FREQUENTI

Una tabella memorizza fisicamente i dati su disco, mentre una vista รจ una tabella virtuale definita da un'istruzione SELECT salvata. Una vista non contiene dati propri; esegue la query ogni volta che viene letta, presentando le righe delle tabelle sottostanti.

SQLite Le viste sono di sola lettura, pertanto le operazioni INSERT, UPDATE e DELETE non possono essere eseguite direttamente su di esse. Per rendere una vista scrivibile, รจ necessario associare un trigger INSTEAD OF che traduca l'operazione in modifiche sulle tabelle di base sottostanti.

Crea un indice sulle colonne utilizzate frequentemente nelle clausole WHERE, JOIN o ORDER BY, in particolare sulle colonne con elevata cardinalitร  e pochi valori duplicati. Gli indici velocizzano le ricerche SELECT, ma aggiungerli a tabelle poco utilizzate o molto piccole offre pochi vantaggi.

Sรฌ. Ogni indice deve essere aggiornato ogni volta che cambiano le righe, quindi ogni indice aggiuntivo comporta un sovraccarico di scrittura e di spazio di archiviazione. Indicizzate le colonne che cercate piรน spesso, ma evitate di sovraindicizzare le tabelle che ricevono un traffico elevato di INSERT, UPDATE o DELETE.

No. SQLite Non esiste un comando CREATE MATERIALIZED VIEW e le viste ordinarie non memorizzano mai i risultati nella cache. Per simularne una, รจ necessario creare una tabella reale e mantenerla sincronizzata utilizzando i trigger AFTER INSERT, UPDATE e DELETE sulle tabelle di origine.

sqlite_master รจ il catalogo di schema integrato che elenca tutte le tabelle, viste, indici e trigger presenti nel database. รˆ possibile interrogarlo, ad esempio con la query SELECT name FROM sqlite_master WHERE type = 'view';, per verificare quali oggetti esistono.

Sรฌ. Gli assistenti AI text-to-SQL trasformano le richieste in linguaggio naturale in SQLite Istruzioni CREATE VIEW, CREATE INDEX e CREATE TRIGGER. Fornire i nomi reali di tabelle e colonne migliora la precisione, e ogni istruzione generata dovrebbe essere rivista e testata prima di essere eseguita sui dati di produzione.

Copilota GitHub suggerisce SQLite viste, indici e trigger in linea in editor come VS CodeLegge lo schema e i commenti nelle vicinanze, quindi i completamenti riutilizzano i nomi reali di tabelle e colonne, ma รจ comunque consigliabile verificare ogni istruzione prima di eseguirla.

Riassumi questo post con: