sql >> Databasteknik >  >> RDS >> SQLite

Skapa en främmande nyckel i SQLite

När du skapar en tabell i SQLite kan du också skapa en främmande nyckel för att upprätta en relation med en annan tabell.

Den här artikeln ger ett exempel på hur du skapar en främmande nyckel när du skapar en tabell i SQLite.

Aktivera stöd för främmande nyckel

Det första vi bör göra är att aktivera stöd för främmande nyckel (om det inte redan har gjorts).

Förutsatt att ditt SQLite-bibliotek inte har det har kompilerats med SQLITE_OMIT_FOREIGN_KEY eller SQLITE_OMIT_TRIGGER definierat, måste du fortfarande aktivera stöd för främmande nyckel under körning.

För att göra detta, kör följande programsats:

PRAGMA foreign_keys = ON;

Detta kommer att möjliggöra upprätthållande av främmande nyckel för din databasanslutning.

Om du öppnar en annan anslutning måste du köra samma programsats för den anslutningen.

Observera att den här inställningen inte krävs för att skapa främmande nycklar, men det krävs för att upprätthålla främmande nycklar.

Nu när vi har aktiverat stöd för främmande nyckel, låt oss gå vidare och skapa en främmande nyckel.

Exempel

Föreställ dig att vi vill ha två tabeller med följande data.

Tabell som heter Husdjur :

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

Tabell som heter Typ s:

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

Och vi vill ha TypeId kolumnen i Husdjur tabell för att referera till TypeId kolumnen i Typer tabell.

Med andra ord vill vi skapa Pets.TypeId den underordnade nyckeln (med en främmande nyckel) och Types.TypeId den överordnade nyckeln (med en primärnyckelbegränsning).

Även om föräldernycklar vanligtvis också är den primära nyckeln för tabellen, är detta faktiskt inte ett krav. I det här exemplet gör vi den till den primära nyckeln.

Vi kan använda följande kod för att skapa dessa två tabeller.

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

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

Den del som skapar den främmande nyckeln är denna:

FOREIGN KEY(TypeId) REFERENCES Types(TypeId)

FOREIGN KEY(TypeId) del deklarerar Pets.TypeId som främmande nyckel.

Även om jag inte kvalificerade kolumnnamnet med dess tabellnamn, vet vi att det är Pets.TypeId (och inte Types.TypeId ) eftersom vi kör detta i CREATE TABLE uttalande för husdjur .

REFERENCES Types(TypeId) anger kolumnen som vår främmande nyckel kommer att referera till. I det här fallet refererar den till TypeId kolumnen i Typer bord.

Nu när våra tabeller har skapats med lämplig främmande nyckel kan vi lägga till data.

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

Tabellerna innehåller nu data som visas ovan.

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   

Brott mot främmande nyckel

Men låt oss nu försöka infoga data som bryter mot den främmande nyckeln.

Låt oss försöka lägga till ett husdjur som använder ett obefintligt TypeID (dvs. ett TypeId värde som inte finns i Typer kolumn).

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

Resultat:

Error: FOREIGN KEY constraint failed

Så vår främmande nyckel förhindrade framgångsrikt dålig data från att komma in i databasen. Det hjälpte oss därför att upprätthålla dataintegriteten.

Om du inte får det här felet och informationen har infogats har du inte aktiverat stöd för främmande nyckel. Som nämnts måste du aktivera stöd för främmande nycklar innan dina främmande nycklar kommer att tillämpas.

Lägga till en främmande nyckel till en befintlig tabell

ALTER TABLE satsen i SQLite är mycket begränsad, och den tillåter inte att lägga till en främmande nyckel till en befintlig tabell.

Därför, om du behöver lägga till en främmande nyckel till en befintlig tabell, måste du släppa tabellen och skapa den igen med begränsningen för främmande nyckel.

Om tabellen innehåller data som du vill behålla kan du överföra den till en annan tabell innan du överför den tillbaka när du har skapat den nya tabellen med den främmande nyckeln.


  1. Använder union och order by-klausul i mysql

  2. Blackout med EMCLI

  3. Fix:"operatör finns inte:heltal || heltal” i PostgreSQL

  4. Omfattning av temporära tabeller i SQL Server