sql >> Database >  >> RDS >> SQLite

Maak een externe sleutel in SQLite

Wanneer u een tabel in SQLite aanmaakt, kunt u ook een externe sleutel maken om een ​​relatie met een andere tabel tot stand te brengen.

Dit artikel geeft een voorbeeld van het maken van een externe sleutel bij het maken van een tabel in SQLite.

Ondersteuning voor externe sleutels inschakelen

Het eerste dat we moeten doen, is ondersteuning voor externe sleutels inschakelen (als dit nog niet is gebeurd).

Ervan uitgaande dat uw SQLite-bibliotheek niet heeft is gecompileerd met SQLITE_OMIT_FOREIGN_KEY of SQLITE_OMIT_TRIGGER gedefinieerd, moet u tijdens runtime nog steeds ondersteuning voor externe sleutels inschakelen.

Voer hiervoor de volgende instructie uit:

PRAGMA foreign_keys = ON;

Dit maakt het afdwingen van buitenlandse sleutels mogelijk voor uw databaseverbinding.

Als u een andere verbinding opent, moet u dezelfde instructie voor die verbinding uitvoeren.

Merk op dat deze instelling niet vereist is voor het maken buitenlandse sleutels, maar het is vereist voor afdwingen buitenlandse sleutels.

Nu we ondersteuning voor externe sleutels hebben ingeschakeld, gaan we verder met het maken van een externe sleutel.

Voorbeeld

Stel je voor dat we twee tabellen willen met de volgende gegevens.

Tabel met de naam Huisdieren :

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

Tabel met de naam Type s:

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

En we willen de TypeId kolom van de Huisdieren tabel om te verwijzen naar de TypeId kolom van de Typen tafel.

Met andere woorden, we willen Pets.TypeId . maken de onderliggende sleutel (met een externe sleutelbeperking), en Types.TypeId de bovenliggende sleutel (met een primaire sleutelbeperking).

Hoewel bovenliggende sleutels meestal ook de primaire sleutel voor de tabel zijn, is dit niet echt een vereiste. In dit voorbeeld maken we er de primaire sleutel van.

We kunnen de volgende code gebruiken om deze twee tabellen te maken.

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

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

Het deel dat de externe sleutel maakt, is dit:

FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

De FOREIGN KEY(TypeId) deel verklaart Pets.TypeId als de externe sleutel.

Hoewel ik de kolomnaam niet heb gekwalificeerd met de tabelnaam, weten we dat het Pets.TypeId is (en niet Types.TypeId ) omdat we dit uitvoeren in de CREATE TABLE verklaring voor Huisdieren .

De REFERENCES Types(TypeId) specificeert de kolom waarnaar onze refererende sleutel zal verwijzen. In dit geval verwijst het naar de TypeId kolom van de Typen tafel.

Nu onze tabellen zijn gemaakt met de juiste externe sleutel, kunnen we gegevens toevoegen.

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 );

De tabellen bevatten nu de hierboven getoonde gegevens.

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   

Overtreding van buitenlandse sleutel

Maar laten we nu proberen gegevens in te voegen die de externe sleutel schenden.

Laten we proberen een huisdier toe te voegen dat een niet-bestaande TypeID gebruikt (d.w.z. een TypeId waarde die niet bestaat in de Typen kolom).

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

Resultaat:

Error: FOREIGN KEY constraint failed

Dus onze externe sleutel heeft met succes voorkomen dat slechte gegevens de database binnenkwamen. Het heeft ons daarom geholpen de gegevensintegriteit te behouden.

Als u deze fout niet krijgt en de gegevens zijn met succes ingevoegd, heeft u ondersteuning voor externe sleutels niet ingeschakeld. Zoals vermeld, moet u ondersteuning voor externe sleutels inschakelen voordat uw externe sleutels worden afgedwongen.

Een externe sleutel toevoegen aan een bestaande tabel

De ALTER TABLE statement in SQLite is zeer beperkt, en het staat het toevoegen van een externe sleutel aan een bestaande tabel niet toe.

Daarom, als u een externe sleutel aan een bestaande tabel moet toevoegen, moet u de tabel laten vallen en opnieuw maken met de externe sleutelbeperking.

Als de tabel gegevens bevat die u wilt behouden, kunt u die gegevens naar een andere tabel overbrengen, voordat u ze weer terugzet nadat u de nieuwe tabel met de externe sleutelbeperking hebt gemaakt.


  1. SQL Server-databases CPU-gebruiksstatistieken

  2. Sjablonen gebruiken in SQL Server Management Studio (SSMS) - SQL Server / TSQL-zelfstudie, deel 16

  3. Oracle-database gebruiken met CakePHP 2.0

  4. Selecteer rijen die niet aanwezig zijn in een andere tabel