Vad är nycklar och begränsningar?
en databas måste följa vissa egenskaper för att upprätthålla integriteten och kvaliteten på de data som den lagrar. Nycklar och begränsningar är regler som definierar vilka datavärden som är tillåtna i vissa datakolumner. De är en viktig databas koncept och är en del av en databas schema definition. Att definiera nycklar och begränsningar är en del av databasdesignprocessen och säkerställer att data i en databas är tillförlitliga och upprätthåller dess integritet. Begränsningar kan gälla för en viss kolumn, en hel tabell, mer än en tabell eller ett helt schema. Ett pålitligt databassystem säkerställer att begränsningar håller hela tiden. Nycklar är en speciell typ av begränsning som används för att skapa relationer och unikhet.
primärnyckel
en nödvändig del av att upprätta relationer mellan två enheter eller två datastycken är att identifiera data korrekt. I SQL är unikt identifierande data kritisk. En primärnyckel är en unik identifierare för en rad data. I kalkylbladsanalogin som vi hittills har använt har det alltid funnits en id
– kolumn. Medan någon kolumn kan fungera som primärnyckel, är det enkelt att använda en kolumn med namnet id
av mnemoniska skäl och är en populär konvention. I en RDBMS kan varje tabell bara ha en primärnyckel.
en primärnyckel är en garanterad unik identifierare för en rad i en tabell. På grund av detta kan vi använda en rads primära nyckelvärde för att referera till den raden från andra tabeller. I det föregående kapitlet etablerade vi relationer mellan flera tabeller baserat på det, men relationsdatabaser behöver ett sätt att relatera till varandra, och den primära nyckelkolumnen är ett sätt att göra detta effektivt. I PostgreSQL ges primära nycklar också prestandafördelar eftersom det är känt att de ofta används för att slå upp data, särskilt i flera tabelluppslag.
var medveten om att inte alla kolumner som heter ”id” är primära nycklar; detta är bara en konvention. Dessutom kan primära nycklar ha något namn.
vi har redan sett syntaxen för att beteckna en kolumn som en primärnyckelkolumn i tidigare kapitel:
Låt oss ta en titt på ovanstående kommando som skapar en tabell som heter users
, ur perspektivet att förstå primärnycklar.
-
id
kolumn är den primära nyckeln i denna tabell. Vi kan också säga att den primära Nyckelbegränsningen har tillämpats på kolumnenid
. -
id
kan bara innehålla numeriska värden (int
). - för varje ny rad som läggs till i tabellen ökas fältet
id
automatiskt med 1. Med många RDBMS används nyckelordetAUTO_INCREMENT
. Med PostgreSQL använder vi serial för att automatiskt öka våra ID och ställa in deras typ som heltal. Det är inte nödvändigt att manuellt ange primärnyckelvärdet varje gång du sätter in data, PostgreSQL gör det åt dig om du anger seriell som typ för id.
främmande nyckel
främmande nyckelkolumner används för att referera till en annan rad med data, kanske i en annan tabell. För att referera till en annan rad behöver databasen en unik identifierare för den raden. Därför innehåller främmande nyckelkolumner värdet på den refererade radens primära nyckel. Till exempel kan en tabell ha en kolumn som heter user_id
som en främmande nyckelkolumn, vilket motsvarar kolumnen id
i tabellen users
. Främmande nycklar är hur RDBMS ställer in relationer mellan rader av data, antingen i samma tabell eller över tabeller.
du kan se från ovanstående SQL-sats att raden för att upprätta detta förhållande är
FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE
i exemplet ovan är id
primärnyckeln i tabellen books
, som används för att upprätta en relation med granskningstabellen. id
– data lagras i recensionstabellen i fältet book_id
för att kartlägga böckerna med recensionerna. ON DELETE CASCADE
– klausulen indikerar att om en bok raderas raderas också alla recensioner som är kopplade till den boken.
sammansatt nyckel som primärnyckel
i föregående kapitel skapade vi en många-till-många-relation, där vår primära Nyckel var gjord av två kolumner. user_id
och book_id
båda tillsammans bildade primärnyckeln för korsreferenstabellen som kan ses i denna rad i SQL-satsen.
PRIMARY KEY (user_id, book_id)
när en primary_key består av ett unikt par PRIMARY KEY (user_id, book_id)
, är det känt som en sammansatt nyckel. Det förekommer vanligtvis i många till många relationer, och vi måste lägga till en extra tabell för att lagra dessa relationsdata. Den sammansatta nyckeln säkerställer att data i tabellen kommer att vara unika för förhållandet mellan användaren och boken. Exempel:
|User_id | Book_id | | 1 | 1 | | 1 | 2 | | 2 | 1 |
unika begränsningar
förutom primärnyckeln tillåter en databas också att tillämpa en unik begränsning på vilken kolumn som helst i databasen. I tabellen böcker kan vi till exempel välja att inte bara ha book_id
som en unik primärnyckel utan också behöva lagra bokens ISBN-nummer. ISBN, International Standard Book Number är ett 10-siffrigt unikt nummer för en bok. Vi kan välja att utforma vår databas för att göra denna kolumn unik. Även om detta inte är en primärnyckel tillåts inte dubbla ISBN-nummer i tabellen böcker och datakvaliteten bibehålls.
den unika begränsningen tillåter inte dubblettinmatning i tabellen böcker för kolumnvärdet för isbn.
inte null begränsningar
vi har sett ”inte NULL” i många av våra SQL-satser. NOT NULL
– begränsningen förhindrar att en kolumn tillåter ett null-värde (dvs. den här kolumnen måste innehålla data). Detta är viktigt för nyckelfält. Till exempel: om du vill lägga till en användare i en databas måste du ange ett användarnamn. Utan denna begränsning skulle databasen fyllas med null-värden och bli mindre användbar.
hur hanterar SQL dessa relationer?
PostgreSQL tillåter relationer mellan både schemat och data i olika tabeller genom användning av främmande nycklar och en operation som kallas en JOIN
. Som namnet antyder är syftet att gå med i tabeller. Genom denna mekanism kan vi till exempel få fullständiga detaljer om författaren till recensionstabellen som visas ovan, eftersom den har ett fält user_id
som relaterar till user
– tabellen. Här är ett snabbt exempel:
nu när vi förstår hur man skapar flera tabeller och rollnycklarna spelar för att skapa relationer, kommer vi att ta en djupare titt på de olika kopplingarna och hur SQL-frågor byggs med hjälp av dessa kopplingar för att hämta de data som krävs från flera tabeller.