Kan een externe sleutel NULL en/of duplicaat zijn?

Verduidelijk twee dingen voor mij:

  1. Kan een externe sleutel NULL zijn?
  2. Kan een externe sleutel duplicaat zijn?

Voor zover ik weet, zou NULLniet gebruikt moeten worden in externe sleutels, maar in een of andere toepassing van mij kan ik NULLinvoeren in zowel Oracle als SQL Server, en ik weet niet waarom.


Antwoord 1, autoriteit 100%

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 simpelweg vereist dat de waarde in dat veld eerst in een andere tabel (de bovenliggende tabel) moet voorkomen. 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, normaal gesproken heb je de mogelijkheid nodig om een null-FK te hebben als je de waarde niet weet op het moment dat de gegevens worden ingevoerd, maar je weet wel andere waarden in de tabel 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 het nu uniek is of niet uniek is of de tabel een één-een of een een-vele relatie heeft met de bovenliggende tabel. Nu als u een een-één-relatie hebt, is het mogelijk dat u de gegevens in één tabel zou kunnen hebben, maar als de tabel te breed is of als de gegevens op een ander onderwerp zijn (de werknemer – verzekeringsvoorbeeld @tbone gaf gaf Bijvoorbeeld), dan wilt u afzonderlijke tafels met een FK. Je zou deze FK dan ook willen maken of ook de PK (die uniciteit garandeert) of er een unieke beperking opzet.

De meeste FKS zijn voor een op veel relaties en dat is wat u van een FK krijgt zonder een verdere beperking op het veld toe te voegen. Dus u hebt bijvoorbeeld een besteltabel en de tabel Ordergegevens. Als de klant tien items in één keer bestelt, heeft hij één bestelling en tien orderdetails die dezelfde volgorde bevatten als de FK.


Antwoord 2, Autoriteit 8%

1 – Ja, sinds ten minste SQL Server 2000.

2 – Ja, zolang het geen UNIQUEbeperking of gekoppeld is aan een unieke index.


Antwoord 3, Autoriteit 8%

Van de mond van het paard:

Buitenlandse sleutels laten sleutelwaarden toe die allemaal null zijn, zelfs als er geen is
Passende primaire of unieke sleutels

Geen beperkingen op de buitenlandse sleutel

Wanneer geen andere beperkingen worden gedefinieerd in de buitenlandse sleutel, elk nummer
van rijen in de kindertafel kan de waarde van dezelfde bovenliggende sleutel verwijzen.
Met dit model wordt nulls in de buitenlandse sleutel mogelijk gemaakt. …

niet nulbeperking op de buitenlandse sleutel

Wanneer nulls niet zijn toegestaan ​​in
Een buitenlandse sleutel, elke rij in de tafel moet expliciet worden verwijzen
waarde in de bovenliggende sleutel omdat nulls niet zijn toegestaan ​​in het buitenland
sleutel.

Elk aantal rijen in de onderliggende tabel kan verwijzen naar dezelfde ouder
sleutelwaarde, dus dit model brengt een één-op-veel-relatie tot stand
tussen de bovenliggende en externe sleutels. Echter, elke rij in het kind
tabel moet een verwijzing hebben naar een bovenliggende sleutelwaarde; de afwezigheid van een
waarde (een null) in de refererende sleutel is niet toegestaan. Hetzelfde voorbeeld in
de vorige paragraaf kan worden gebruikt om een dergelijke relatie te illustreren.
In dit geval moeten werknemers echter een verwijzing hebben naar een specifieke
afdeling.

UNIEKE beperking op de buitenlandse sleutel

Wanneer een UNIEKE beperking is
gedefinieerd op de externe sleutel, kan slechts één rij in de onderliggende tabel
verwijzen naar een bepaalde bovenliggende sleutelwaarde. Dit model staat nulls toe in de
buitenlandse sleutel.

Dit model brengt een één-op-één relatie tussen de ouder tot stand
en externe sleutels die onbepaalde waarden (nulls) in de . toestaan
vreemde sleutel. Neem bijvoorbeeld aan dat de werknemerstabel een kolom had
met de naam MEMBERNO, verwijzend naar een lidmaatschapsnummer van een werknemer in de
verzekeringsplan van het bedrijf. Ook heeft een tabel met de naam INSURANCE een primaire
sleutel met de naam MEMBERNO, en andere kolommen van de tabel behouden respectief
informatie met betrekking tot een werknemersverzekering. Het MEMBERNO in
de werknemerstabel moet zowel een externe sleutel als een unieke sleutel zijn:

  • Referentiële integriteitsregels afdwingen tussen de EMP_TAB en
    VERZEKERINGstabellen (de FOREIGN KEY-beperking)

  • Om te garanderen dat elke medewerker een uniek lidmaatschapsnummer heeft (de
    UNIEKE sleutelbeperking)

UNIEKE en NIET NULL-beperkingen voor de externe sleutel

Wanneer beide UNIEKE
en NOT NULL-beperkingen zijn gedefinieerd op de externe sleutel, slechts één rij
in de onderliggende tabel kan verwijzen naar een bepaalde bovenliggende sleutelwaarde, en omdat
NULL-waarden zijn niet toegestaan in de refererende sleutel, elke rij in het kind
tabel moet expliciet verwijzen naar een waarde in de bovenliggende sleutel.

Zie dit:

Oracle 11g-link


Antwoord 4, autoriteit 4%

Ja, een externe sleutel kan nul zijn, zoals hierboven verteld door ervaren programmeurs… Ik zou nog een scenario toevoegen waarin de externe sleutel nul moet zijn….
stel dat we tabellen met opmerkingen, afbeeldingen en video’s hebben in een toepassing die opmerkingen over afbeeldingen en video’s toestaat. In de opmerkingentabel kunnen we twee Foreign Keys PicturesId en VideosId hebben, samen met de primaire Key CommentId. Dus als je op een video reageert, is alleen VideosId vereist en is pictureId null… en als je op een foto reageert, is alleen PictureId vereist en is VideosId null…


Antwoord 5, autoriteit 2%

het hangt ervan af welke rol deze foreign keyspeelt in uw relatie.

  1. als deze foreign keyook een key attributeis in uw relatie, dan kan het niet NULL zijn
  2. als deze foreign keyeen normaal attribuut is in je relatie, dan kan het NULL zijn.

Antwoord 6

Hier is een voorbeeld met Oracle-syntaxis:
Laten we eerst een tabel maken LAND

CREATE TABLE TBL_COUNTRY ( COUNTRY_ID VARCHAR2 (50) NOT NULL ) ;
ALTER TABLE TBL_COUNTRY ADD CONSTRAINT COUNTRY_PK PRIMARY KEY ( COUNTRY_ID ) ;

Maak de tabel PROVINCIE

CREATE TABLE TBL_PROVINCE(
PROVINCE_ID VARCHAR2 (50) NOT NULL ,
COUNTRY_ID  VARCHAR2 (50)
);
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_PK PRIMARY KEY ( PROVINCE_ID ) ;
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_COUNTRY_FK FOREIGN KEY ( COUNTRY_ID ) REFERENCES TBL_COUNTRY ( COUNTRY_ID ) ;

Dit loopt perfect in Oracle. Let op de buitenlandse sleutel in Country_Id in de tweede tabel heeft geen “niet null”.

Nu om een ​​rij in de provincietabel in te voegen, is het voldoende om alleen de provincie te specificeren. Als u echter ook kiest om ook een Country_ID op te geven, moet deze al aanwezig zijn in de tafel.


Antwoord 7

Standaard zijn er geen beperkingen op de buitenlandse sleutel, de buitenlandse sleutel kan null en dupliceren zijn.

Tijdens het maken van een tabel / het wijzigen van de tabel, als u een beperking van uniciteit toevoegt of niet null, dan staat het alleen de null / dubbele waarden toe.


Antwoord 8

Simpel gezegd, “Niet-identificeren” relaties tussen entiteiten is onderdeel van ER-model en is beschikbaar in Microsoft Visio bij het ontwerpen van ER-Diagram. Dit is vereist om de kardinaliteit tussen entiteiten van het type “nul of meer dan nul”, of “nul of één” afdwingt. Let op deze “nul” in de cardinaliteit in plaats van “één” in “één tot velen”.

Nu, voorbeeld van niet-identificerende relatie waarbij de kardinaliteit kan zijn “nul” (niet-identificeren) is wanneer we een record / object in één entiteit zeggen – een “mei” of “mag niet” een waarde als referentie hebben naar de record / s in een andere entiteit-b.

Zoals, er is een mogelijkheid voor één record van entiteit-A om zichzelf te identificeren aan de records van andere entiteit-B, daarom moet er een kolom in entiteit-b zijn om de identiteitswaarde van het verslag van entiteit te hebben B. Deze kolom kan “null” zijn als er geen record in entiteit is – een identificeert de record / s (of, object / s) in entiteit-b.

In object georiënteerd (real-world) paradigma zijn er situaties waarin een doel van klasse-B niet noodzakelijkerwijs hangt (sterk gekoppeld) op het doel van klasse-A voor zijn bestaan, wat betekent dat Class-B losjes is gekoppeld Met klasse-A kan een dergelijke klasse-A “(insluiting) een object van klasse-A kan bevatten, in tegenstelling tot het concept van het doel van klasse-B (samenstelling) een voorwerp van klasse-A, voor zijn (object) van klasse-b) creatie.

Vanaf SQL Query Point of View kunt u alle records in entiteit-b quereren die “niet null” zijn voor buitenlandse sleutel gereserveerd voor entiteit-b. Dit brengt alle records met bepaalde overeenkomstige waarde voor rijen in entiteit – een alternatief zijn alle records met null-waarde de records die geen record in entiteit hebben – A in entiteit-b.


Antwoord 9

Kan een buitenlandse sleutel null zijn?

Bestaande antwoorden gericht op single-kolomscenario. Als we multi-kolom Buitenlandse sleutel beschouwen, hebben we meer opties met MATCH [SIMPLE | PARTIAL | FULL]clausule gedefinieerd in SQL-standaard:

postgreSQL-create tabel

Een waarde die in de verwijzende kolom(men) is ingevoegd, wordt vergeleken met de waarden van de tabel waarnaar wordt verwezen en de kolommen waarnaar wordt verwezen met behulp van het opgegeven zoektype. Er zijn drie wedstrijdtypes: MATCH FULL, MATCH PARTIAL en MATCH SIMPLE (wat de standaardinstelling is). MATCH FULLstaat niet toe dat één kolom van een refererende sleutel met meerdere kolommen null is, tenzij alle kolommen met refererende sleutels null zijn; als ze allemaal null zijn, hoeft de rij geen overeenkomst te hebben in de tabel waarnaar wordt verwezen. EENVOUDIG VERGELIJKENstaat toe dat alle kolommen met vreemde sleutels null zijn; als een van deze null is, hoeft de rij geen overeenkomst te hebben in de tabel waarnaar wordt verwezen. MATCH PARTIALis nog niet geïmplementeerd.

(Natuurlijk kunnen GEEN NULL-beperkingen worden toegepast op de verwijzende kolom(men) om te voorkomen dat deze gevallen optreden.)

Voorbeeld:

CREATE TABLE A(a VARCHAR(10), b VARCHAR(10), d DATE , UNIQUE(a,b));
INSERT INTO A(a, b, d) 
VALUES (NULL, NULL, NOW()),('a', NULL, NOW()),(NULL, 'b', NOW()),('c', 'b', NOW());
CREATE TABLE B(id INT PRIMARY KEY, ref_a VARCHAR(10), ref_b VARCHAR(10));
-- MATCH SIMPLE - default behaviour nulls are allowed
ALTER TABLE B ADD CONSTRAINT B_Fk FOREIGN KEY (ref_a, ref_b) 
REFERENCES A(a,b) MATCH SIMPLE;
INSERT INTO B(id, ref_a, ref_b) VALUES (1, NULL, 'b');  
-- (NULL/'x') 'x' value does not exists in A table, but insert is valid
INSERT INTO B(id, ref_a, ref_b) VALUES (2, NULL, 'x');  
ALTER TABLE B DROP CONSTRAINT IF EXISTS B_Fk; -- cleanup
-- MATCH PARTIAL - not implemented
ALTER TABLE B ADD CONSTRAINT B_Fk FOREIGN KEY (ref_a, ref_b) 
REFERENCES A(a,b) MATCH PARTIAL;
-- ERROR:  MATCH PARTIAL not yet implemented
DELETE FROM B; ALTER TABLE B DROP CONSTRAINT IF EXISTS B_Fk; -- cleanup
-- MATCH FULL nulls are not allowed
ALTER TABLE B ADD CONSTRAINT B_Fk FOREIGN KEY (ref_a, ref_b) 
REFERENCES A(a,b) MATCH FULL;
-- FK is defined, inserting NULL as part of FK
INSERT INTO B(id, ref_a, ref_b) VALUES (1, NULL, 'b');
-- ERROR:  MATCH FULL does not allow mixing of null and nonnull key values.
-- FK is defined, inserting all NULLs - valid
INSERT INTO B(id, ref_a, ref_b) VALUES (1, NULL, NULL);

db<>fiddle-demo


Antwoord 10

Ik denk dat het beter is om rekening te houden met de mogelijke kardinaliteit die we in de tabellen hebben.
We kunnen een mogelijke minimale kardinaliteit nul hebben. Als het optioneel is, kan de minimale deelname van tuples uit de gerelateerde tabel nul zijn. Nu wordt u geconfronteerd met de noodzaak dat externe sleutelwaarden null moeten worden toegestaan.

Maar het antwoord is dat het allemaal afhangt van het bedrijf.


Antwoord 11

Het idee van een externe sleutel is gebaseerd op het concept van het verwijzen naar een waarde die al in de hoofdtabel bestaat. Daarom wordt het in de andere tabel een externe sleutel genoemd. Dit concept wordt referentiële integriteit genoemd. Als een externe sleutel als een null-veld wordt gedeclareerd, schendt het de logica van referentiële integriteit. Waar zal het naar verwijzen? Het kan alleen verwijzen naar iets dat aanwezig is in de hoofdtabel. Daarom denk ik dat het verkeerd zou zijn om een veld voor een externe sleutel als null te declareren.


Antwoord 12

Ik denk dat de externe sleutel van de ene tabel ook de primaire sleutel is voor een andere tabel. Dus het staat geen nulls toe. Er is dus geen sprake van een null-waarde in een externe sleutel.

Other episodes