sql >> Databasteknik >  >> RDS >> Sqlserver

Kan en främmande nyckel vara NULL och/eller dupliceras?

Kort svar:Ja, det kan vara NULL eller duplicerat.

Jag vill förklara varför en främmande nyckel kan behöva vara null eller kan behöva vara unik eller inte unik. Kom först ihåg att en främmande nyckel kräver helt enkelt att värdet i det fältet måste finnas först i en annan tabell (den överordnade tabellen). Det är allt ett FK är per definition. Null är per definition inte ett värde. Null betyder att vi ännu inte vet vad värdet är.

Låt mig ge dig ett verkligt exempel. Anta att du har en databas som lagrar försäljningsförslag. Antag vidare att varje förslag endast har en säljare tilldelad och en kund. Så din förslagstabell skulle ha två främmande nycklar, en med klient-ID och en med säljare-ID. Men vid den tidpunkt då posten skapas tilldelas inte alltid en säljare (eftersom ingen är ledig att arbeta med den ännu), så kund-ID är ifyllt men säljare-ID kan vara null. Med andra ord, vanligtvis behöver du möjligheten att ha en noll FK när du kanske inte vet dess värde vid den tidpunkt då data skrivs in, men du vet andra värden i tabellen som måste anges. För att tillåta nollor i en FK i allmänhet är allt du behöver göra att tillåta nollor på fältet som har FK. Nullvärdet är skilt från idén om att det är en FK.

Om det är unikt eller inte unikt avser om tabellen har en en-en- eller en-många-relation till den överordnade tabellen. Om du nu har en en-en-relation är det möjligt att du kan ha alla data i en tabell, men om tabellen blir för bred eller om data handlar om ett annat ämne (anställd - försäkringsexempel @tbone gav till exempel), då vill du ha separata tabeller med en FK. Du skulle då vilja göra denna FK antingen till PK (vilket garanterar unikhet) eller sätta en unik begränsning på den.

De flesta FK är för en en till många relation och det är vad du får från en FK utan att lägga till en ytterligare begränsning på planen. Så du har en beställningstabell och beställningsinformationstabellen till exempel. Om kunden beställer tio artiklar samtidigt har han en order och tio orderdetaljposter som innehåller samma orderID som FK.



  1. MySQL Infoga i från en databas i en annan

  2. Skiftlägesokänslig sökning i Oracle

  3. En berättelse om två klustringsfaktorer

  4. Neo4j - Skapa ett index med Cypher