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

Erstellen Sie einen Fremdschlüssel in SQLite

Wenn Sie eine Tabelle in SQLite erstellen, können Sie auch einen Fremdschlüssel erstellen, um eine Beziehung zu einer anderen Tabelle herzustellen.

Dieser Artikel enthält ein Beispiel für das Erstellen eines Fremdschlüssels beim Erstellen einer Tabelle in SQLite.

Fremdschlüsselunterstützung aktivieren

Das erste, was wir tun sollten, ist die Unterstützung von Fremdschlüsseln zu aktivieren (falls dies noch nicht geschehen ist).

Angenommen, Ihre SQLite-Bibliothek nicht wurde mit SQLITE_OMIT_FOREIGN_KEY kompiliert oder SQLITE_OMIT_TRIGGER definiert haben, müssen Sie zur Laufzeit dennoch die Fremdschlüsselunterstützung aktivieren.

Führen Sie dazu die folgende Anweisung aus:

PRAGMA foreign_keys = ON;

Dadurch wird die Durchsetzung von Fremdschlüsseln für Ihre Datenbankverbindung aktiviert.

Wenn Sie eine andere Verbindung öffnen, müssen Sie dieselbe Anweisung für diese Verbindung ausführen.

Beachten Sie, dass diese Einstellung zum Erstellen nicht erforderlich ist Fremdschlüssel, aber es wird zum Erzwingen benötigt Fremdschlüssel.

Nachdem wir nun die Unterstützung für Fremdschlüssel aktiviert haben, können wir fortfahren und einen Fremdschlüssel erstellen.

Beispiel

Stellen Sie sich vor, wir wollen zwei Tabellen mit den folgenden Daten.

Tabelle namens Haustiere :

PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         

Tabelle namens Typ s:

TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Und wir wollen die TypeId Spalte der Haustiere Tabelle, um auf die TypeId zu verweisen Spalte der Typen Tisch.

Mit anderen Worten, wir möchten Pets.TypeId erstellen der untergeordnete Schlüssel (mit einer Fremdschlüsseleinschränkung) und Types.TypeId der übergeordnete Schlüssel (mit einer Primärschlüsseleinschränkung).

Während übergeordnete Schlüssel normalerweise auch der Primärschlüssel für die Tabelle sind, ist dies eigentlich keine Voraussetzung. In diesem Beispiel machen wir ihn zum Primärschlüssel.

Wir können den folgenden Code verwenden, um diese beiden Tabellen zu erstellen.

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

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

Der Teil, der den Fremdschlüssel erstellt, ist dieser:

FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

Der FOREIGN KEY(TypeId) Teil deklariert Pets.TypeId als Fremdschlüssel.

Obwohl ich den Spaltennamen nicht mit seinem Tabellennamen qualifiziert habe, wissen wir, dass es Pets.TypeId ist (und nicht Types.TypeId ), da wir dies in CREATE TABLE ausführen Erklärung für Haustiere .

Die REFERENCES Types(TypeId) gibt die Spalte an, auf die unser Fremdschlüssel verweist. In diesem Fall wird auf die TypeId verwiesen Spalte der Typen Tabelle.

Nachdem unsere Tabellen nun mit dem entsprechenden Fremdschlüssel erstellt wurden, können wir Daten hinzufügen.

INSERT INTO Types VALUES 
    ( NULL, 'Dog' ),
    ( NULL, 'Cat' ),
    ( NULL, 'Parakeet' ),
    ( NULL, 'Hamster' );

INSERT INTO Pets VALUES 
    ( NULL, 'Brush', 3 ),
    ( NULL, 'Tweet', 3 ),
    ( NULL, 'Yelp', 1 ),
    ( NULL, 'Woofer', 1 ),
    ( NULL, 'Fluff', 2 );

Die Tabellen enthalten jetzt die oben gezeigten Daten.

sqlite> SELECT * FROM Pets;
PetId       PetName     TypeId    
----------  ----------  ----------
1           Brush       3         
2           Tweet       3         
3           Yelp        1         
4           Woofer      1         
5           Fluff       2         
sqlite> SELECT * FROM Types;
TypeId      Type      
----------  ----------
1           Dog       
2           Cat       
3           Parakeet  
4           Hamster   

Fremdschlüsselverletzung

Aber jetzt versuchen wir, Daten einzufügen, die den Fremdschlüssel verletzen.

Versuchen wir, ein Haustier hinzuzufügen, das eine nicht vorhandene TypeID verwendet (d. h. eine TypeId Wert, der in den Typen nicht vorhanden ist Säule).

INSERT INTO Pets VALUES 
    ( NULL, 'Homer', 5 );

Ergebnis:

Error: FOREIGN KEY constraint failed

Unser Fremdschlüssel hat also erfolgreich verhindert, dass schlechte Daten in die Datenbank gelangen. Es hat uns daher geholfen, die Datenintegrität zu wahren.

Wenn Sie diesen Fehler nicht erhalten und die Daten erfolgreich eingefügt wurden, haben Sie die Fremdschlüsselunterstützung nicht aktiviert. Wie bereits erwähnt, müssen Sie die Unterstützung für Fremdschlüssel aktivieren, bevor Ihre Fremdschlüssel erzwungen werden.

Hinzufügen eines Fremdschlüssels zu einer bestehenden Tabelle

Die ALTER TABLE -Anweisung in SQLite ist sehr eingeschränkt und erlaubt nicht das Hinzufügen eines Fremdschlüssels zu einer vorhandenen Tabelle.

Wenn Sie also einer vorhandenen Tabelle einen Fremdschlüssel hinzufügen müssen, müssen Sie die Tabelle löschen und mit der Fremdschlüsseleinschränkung erneut erstellen.

Wenn die Tabelle Daten enthält, die Sie behalten möchten, können Sie diese Daten in eine andere Tabelle übertragen, bevor Sie sie zurück übertragen, sobald Sie die neue Tabelle mit der Fremdschlüsseleinschränkung erstellt haben.