SQLite include un'istruzione PRAGMA che ti consente di verificare la presenza di violazioni di chiavi esterne su un intero database o su una determinata tabella.
L'istruzione è PRAGMA foreign_key_check
, e funziona come segue.
Sintassi
Puoi usarlo in due modi:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);
La prima riga controlla l'intero database, mentre la seconda controlla solo una tabella specifica.
Lo schema
opzionale argomento specifica il nome di un database collegato o principale o temp per i database principale e TEMP. Se schema
è omesso, principale è assunto.
Esempio
Creiamo due tabelle con una relazione tra loro.
In questo caso, gli Animali domestici la tabella ha una chiave esterna che fa riferimento a TypeId colonna sui Tipi tabella.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Ora inseriamo i dati che violano il vincolo di chiave esterna.
PRAGMA foreign_keys = OFF;
INSERT INTO Types VALUES
( 1, 'Dog' ),
( 2, 'Cat' );
INSERT INTO Pets VALUES
( 1, 'Homer', 3 );
Il secondo INSERT
istruzione viola il vincolo di chiave esterna. Questo perché inserisce un valore di 3 in Pets.TypeId colonna, quando non è presente un valore corrispondente in Types.TypeId colonna.
Una cosa importante da notare qui è che ho disabilitato esplicitamente le chiavi esterne usando PRAGMA foreign_keys = OFF
. Questa è l'impostazione predefinita in SQLite, ma volevo chiarire questo esempio.
Ora controlliamo il database per le violazioni della chiave esterna.
PRAGMA foreign_key_check;
Risultato:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0
Questo ci dice che gli Animali domestici la tabella presenta una violazione della chiave esterna sulla riga con un ROWID pari a 1. Ci dice anche il nome della tabella padre, nonché l'ID della chiave esterna.
Aggiungiamo più dati agli Animali domestici tabella ed eseguire nuovamente il controllo. Le prime due righe aderiscono alla chiave esterna, ma l'ultima riga no.
INSERT INTO Pets VALUES
( NULL, 'Yelp', 1 ),
( NULL, 'Fluff', 2 ),
( NULL, 'Brush', 4 );
PRAGMA foreign_key_check;
Risultato:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Ora abbiamo due righe restituite durante il controllo dell'intero database per le violazioni della chiave esterna.
Controlla una tabella specifica
È inoltre possibile specificare una tabella su cui eseguire il controllo.
Ecco un esempio di riscrittura del controllo precedente per specificare solo gli Animali domestici tabella.
PRAGMA foreign_key_check(Pets);
Risultato:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Stesso risultato.
Ecco il risultato se specifico l'altra tabella.
PRAGMA foreign_key_check(Types);
Risultato:
(È vuoto perché non ci sono risultati.)
Specificare uno schema
Come accennato, puoi anche specificare lo schema.
PRAGMA main.foreign_key_check(Pets);
Risultato:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Nel mio caso ho usato il database principale, ma potresti sostituire main
con il nome del database allegato.
Come applicare le chiavi esterne
Come accennato, SQLite non applica le chiavi esterne a meno che non specifichi esplicitamente che dovrebbero essere applicate.
Puoi applicare le chiavi esterne usando PRAGMA foreign_keys = ON
.
Per ulteriori informazioni ed esempi, vedere Come abilitare il supporto per chiavi esterne in SQLite.