sql >> Database >  >> RDS >> Sqlserver

Kan een externe sleutel NULL en/of duplicaat zijn?

Kort antwoord:Ja, het kan NULL of duplicaat zijn.

Ik wil uitleggen waarom een ​​externe sleutel mogelijk null moet zijn of uniek of niet uniek moet zijn. Onthoud eerst dat een Foreign-sleutel alleen vereist dat de waarde in dat veld eerst in een andere tabel (de bovenliggende tabel) moet staan. Dat is alles wat een FK per definitie is. Null is per definitie geen waarde. Null betekent dat we nog niet weten wat de waarde is.

Laat me je een voorbeeld uit het echte leven geven. Stel dat u een database heeft waarin verkoopvoorstellen worden opgeslagen. Stel verder dat aan elk voorstel slechts één verkoper en één klant is toegewezen. Uw voorsteltabel zou dus twee externe sleutels hebben, één met de klant-ID en één met de verkoper-ID. Op het moment dat het record wordt gemaakt, wordt echter niet altijd een verkoper toegewezen (omdat niemand er nog aan kan werken), dus de klant-ID is ingevuld, maar de verkoper-ID kan nul zijn. Met andere woorden, u hebt meestal de mogelijkheid nodig om een ​​null-FK te hebben wanneer u de waarde ervan niet weet op het moment dat de gegevens worden ingevoerd, maar u wel andere waarden in de tabel kent die moeten worden ingevoerd. Om nulls in een FK toe te staan, hoef je over het algemeen alleen nulls toe te staan ​​op het veld met de FK. De nulwaarde staat los van het idee dat het een FK is.

Of de tabel uniek of niet uniek is, hangt af van de vraag of de tabel een een-een- of een een-veel-relatie heeft met de bovenliggende tabel. Als u nu een een-op-een-relatie heeft, is het mogelijk dat u de gegevens allemaal in één tabel zou kunnen hebben, maar als de tabel te breed wordt of als de gegevens over een ander onderwerp gaan (het werknemersverzekeringsvoorbeeld dat @tbone gaf bijvoorbeeld), dan wil je aparte tabellen met een FK. Je zou deze FK dan ofwel ook de PK willen maken (die uniciteit garandeert) of er een unieke beperking op leggen.

De meeste FK's zijn voor een een-op-veel-relatie en dat is wat je van een FK krijgt zonder een verdere beperking op het veld toe te voegen. Zo heb je bijvoorbeeld een besteltabel en de tabel met bestelgegevens. Als de klant tien artikelen tegelijk bestelt, heeft hij één order en tien orderdetailrecords die dezelfde orderID bevatten als de FK.



  1. Master High Availability Manager (MHA) is gecrasht! Wat moet ik nu doen?

  2. Hoe een bytearray (afbeeldingsgegevens) van en naar een SQLite-database opslaan en ophalen?

  3. SQLAlchemy func.count op booleaanse kolom

  4. Genereer n rijen NULL in PostgreSQL