SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Finden Sie Fremdschlüsselverletzungen in SQLite

SQLite enthält eine PRAGMA-Anweisung, mit der Sie eine ganze Datenbank oder eine bestimmte Tabelle auf Fremdschlüsselverletzungen prüfen können.

Die Anweisung lautet PRAGMA foreign_key_check , und es funktioniert wie folgt.

Syntax

Sie können es auf zwei Arten verwenden:

PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);

Die erste Zeile überprüft die gesamte Datenbank, während die zweite nur eine bestimmte Tabelle überprüft.

Das optionale schema Argument gibt den Namen einer angehängten Datenbank oder main an oder temp für die Haupt- und die TEMP-Datenbank. Wenn schema weggelassen wird, main wird angenommen.

Beispiel

Lassen Sie uns zwei Tabellen mit einer Beziehung zwischen ihnen erstellen.

In diesem Fall die Haustiere Tabelle hat einen Fremdschlüssel, der auf die TypeId verweist Spalte auf den Typen Tabelle.

CREATE TABLE Types( 
    TypeId INTEGER PRIMARY KEY, 
    Type
);

CREATE TABLE Pets( 
    PetId INTEGER PRIMARY KEY, 
    PetName,
    TypeId,
    FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);

Lassen Sie uns nun Daten eingeben, die gegen die Fremdschlüsselbeschränkung verstoßen.

PRAGMA foreign_keys = OFF;

INSERT INTO Types VALUES 
    ( 1, 'Dog' ),
    ( 2, 'Cat' );

INSERT INTO Pets VALUES 
    ( 1, 'Homer', 3 );

Das zweite INSERT -Anweisung verletzt die Fremdschlüsseleinschränkung. Dies liegt daran, dass es einen Wert von 3 in die Pets.TypeId einfügt -Spalte, wenn in Types.TypeId kein entsprechender Wert vorhanden ist Spalte.

Eine wichtige Sache, die hier zu beachten ist, ist, dass ich Fremdschlüssel explizit deaktiviert habe, indem ich PRAGMA foreign_keys = OFF verwendet habe . Dies ist die Standardeinstellung in SQLite, aber ich wollte es für dieses Beispiel deutlich machen.

Lassen Sie uns nun die Datenbank auf Fremdschlüsselverletzungen überprüfen.

PRAGMA foreign_key_check;

Ergebnis:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         

Dies sagt uns, dass die Haustiere Tabelle hat eine Fremdschlüsselverletzung in der Zeile mit einer ROWID von 1. Sie teilt uns auch den Namen der übergeordneten Tabelle sowie die Fremdschlüssel-ID mit.

Lassen Sie uns den Haustieren weitere Daten hinzufügen Tabelle und führen Sie die Prüfung erneut aus. Die ersten beiden Zeilen halten sich an den Fremdschlüssel, die letzte Zeile jedoch nicht.

INSERT INTO Pets VALUES 
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Fluff', 2 ),
    ( NULL, 'Brush', 4 );

PRAGMA foreign_key_check;

Ergebnis:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

Wir haben jetzt zwei Zeilen zurückgegeben, wenn wir die gesamte Datenbank auf Fremdschlüsselverletzungen prüfen.

Überprüfen Sie eine bestimmte Tabelle

Sie können auch eine Tabelle angeben, für die die Prüfung ausgeführt werden soll.

Hier ist ein Beispiel für das Umschreiben der vorherigen Prüfung, um nur die Haustiere anzugeben Tabelle.

PRAGMA foreign_key_check(Pets);

Ergebnis:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

Gleiches Ergebnis.

Hier ist das Ergebnis, wenn ich die andere Tabelle angebe.

PRAGMA foreign_key_check(Types);

Ergebnis:

 

(Es ist leer, weil es keine Ergebnisse gibt.)

Geben Sie ein Schema an

Wie erwähnt, können Sie auch das Schema angeben.

PRAGMA main.foreign_key_check(Pets);

Ergebnis:

table       rowid       parent      fkid      
----------  ----------  ----------  ----------
Pets        1           Types       0         
Pets        4           Types       0         

In meinem Fall habe ich die Hauptdatenbank verwendet, aber Sie könnten main ersetzen mit dem Namen Ihrer angehängten Datenbank.

So erzwingen Sie Fremdschlüssel

Wie bereits erwähnt, erzwingt SQLite keine Fremdschlüssel, es sei denn, Sie geben ausdrücklich an, dass sie erzwungen werden sollen.

Sie können Fremdschlüssel mit PRAGMA foreign_keys = ON erzwingen .

Weitere Informationen und Beispiele finden Sie unter Aktivieren der Fremdschlüsselunterstützung in SQLite.