446 Stimmen

Kann ein Fremdschlüssel NULL und/oder ein Duplikat sein?

Bitte klären Sie zwei Dinge für mich:

  1. Kann ein Fremdschlüssel NULL sein?
  2. Kann ein Fremdschlüssel dupliziert werden?

So fair wie ich weiß, NULL sollte nicht in Fremdschlüsseln verwendet werden, aber in einer Anwendung von mir kann ich Folgendes eingeben NULL sowohl in Oracle als auch in SQL Server, und ich weiß nicht, warum.

704voto

HLGEM Punkte 91543

Kurze Antwort: Ja, es kann NULL oder ein Duplikat sein.

Ich möchte erklären, warum ein Fremdschlüssel möglicherweise null sein muss oder eindeutig oder nicht eindeutig sein muss. Denken Sie zunächst daran, dass ein Fremdschlüssel einfach voraussetzt, dass der Wert in diesem Feld zuerst in einer anderen Tabelle (der übergeordneten Tabelle) vorhanden sein muss. Das ist alles, was ein FK per Definition ist. Null ist per Definition kein Wert. Null bedeutet, dass wir noch nicht wissen, was der Wert ist.

Ich möchte Ihnen ein Beispiel aus dem wirklichen Leben geben. Nehmen wir an, Sie haben eine Datenbank, in der Verkaufsangebote gespeichert sind. Nehmen wir weiter an, dass jedem Angebot nur ein Vertriebsmitarbeiter und ein Kunde zugeordnet ist. Ihre Angebotstabelle hätte dann zwei Fremdschlüssel, einen mit der Kunden-ID und einen mit der ID des Verkäufers. Zum Zeitpunkt der Erstellung des Datensatzes ist jedoch nicht immer ein Vertriebsmitarbeiter zugewiesen (weil noch niemand daran arbeiten kann), so dass die Kunden-ID zwar ausgefüllt ist, die ID des Vertriebsmitarbeiters jedoch leer sein kann. Mit anderen Worten, in der Regel benötigen Sie die Möglichkeit, eine Null-FK zu haben, wenn Sie ihren Wert zum Zeitpunkt der Dateneingabe nicht kennen, aber andere Werte in der Tabelle, die eingegeben werden müssen, kennen. Um Nullen in einer FK zuzulassen, müssen Sie im Allgemeinen nur Nullen für das Feld zulassen, das die FK enthält. Der Nullwert ist von der Idee, dass es sich um eine FK handelt, unabhängig.

Ob sie eindeutig oder nicht eindeutig ist, hängt davon ab, ob die Tabelle eine Eins-zu-Eins- oder eine Eins-zu-Viel-Beziehung zur übergeordneten Tabelle hat. Wenn Sie nun eine Eins-zu-Eins-Beziehung haben, ist es möglich, dass Sie die Daten alle in einer Tabelle haben, aber wenn die Tabelle zu umfangreich wird oder wenn die Daten ein anderes Thema betreffen (z. B. das von @tbone genannte Beispiel der Arbeitnehmerversicherung), dann wollen Sie separate Tabellen mit einem FK. Diese FK sollte dann entweder auch die PK sein (die Eindeutigkeit garantiert) oder mit einer eindeutigen Einschränkung versehen werden.

Die meisten FKs sind für eine eins-zu-viele-Beziehung gedacht, und das ist es, was man von einer FK erhält, ohne eine weitere Einschränkung auf dem Feld hinzuzufügen. Sie haben zum Beispiel eine Auftragstabelle und eine Tabelle mit Auftragsdetails. Wenn der Kunde zehn Artikel auf einmal bestellt, hat er eine Bestellung und zehn Bestelldatensätze, die dieselbe orderID wie die FK enthalten.

54voto

tbone Punkte 14490

Aus berufenem Munde:

Fremdschlüssel erlauben Schlüsselwerte, die alle NULL sind, auch wenn es keine PRIMARY- oder UNIQUE-Schlüssel übereinstimmen

Keine Beschränkungen für den Fremdschlüssel

Wenn keine anderen Einschränkungen für den Fremdschlüssel definiert sind, kann eine beliebige Anzahl von Zeilen in der untergeordneten Tabelle auf denselben übergeordneten Schlüsselwert verweisen. Dieses Modell erlaubt Nullen im Fremdschlüssel. ...

NOT NULL-Beschränkung für den Fremdschlüssel

Wenn Nullen nicht erlaubt sind in einem Fremdschlüssel nicht erlaubt sind, muss jede Zeile in der untergeordneten Tabelle explizit auf eine Wert im übergeordneten Schlüssel verweisen, da Nullen im Fremdschlüssel nicht Schlüssel nicht erlaubt sind.

Eine beliebige Anzahl von Zeilen in der untergeordneten Tabelle kann auf die gleiche übergeordnete Tabelle verweisen Schlüsselwert verweisen, so dass dieses Modell eine Eins-zu-Viel-Beziehung zwischen dem übergeordneten Schlüssel und den Fremdschlüsseln. Allerdings muss jede Zeile in der untergeordneten Tabelle muss jedoch einen Verweis auf einen übergeordneten Schlüsselwert haben; das Fehlen eines Wert (eine Null) im Fremdschlüssel ist nicht erlaubt. Das gleiche Beispiel aus dem vorigen Abschnitt kann verwendet werden, um eine solche Beziehung zu veranschaulichen. In diesem Fall müssen die Mitarbeiter jedoch einen Verweis auf eine bestimmte Abteilung haben.

UNIQUE-Beschränkung für den Fremdschlüssel

Wenn eine UNIQUE-Beschränkung Fremdschlüssel definiert ist, kann nur eine Zeile in der untergeordneten Tabelle auf einen bestimmten Wert des übergeordneten Schlüssels verweisen. Dieses Modell erlaubt Nullen im Fremdschlüssel.

Dieses Modell stellt eine Eins-zu-Eins-Beziehung zwischen dem Elternteil und Fremdschlüsseln, die unbestimmte Werte (Nullen) im Fremdschlüssel erlaubt. Nehmen wir zum Beispiel an, die Angestelltentabelle hätte eine Spalte namens MEMBERNO, die sich auf die Mitgliedsnummer eines Mitarbeiters in der Versicherungsplan der Firma. Eine Tabelle namens INSURANCE hat einen Primärschlüssel Primärschlüssel namens MEMBERNO, und andere Spalten der Tabelle enthalten entsprechende Informationen in Bezug auf die Versicherungspolice eines Mitarbeiters. Die MEMBERNO in der der Angestelltentabelle muss sowohl ein Fremdschlüssel als auch ein eindeutiger Schlüssel sein:

  • Zur Durchsetzung von Regeln der referentiellen Integrität zwischen EMP_TAB und INSURANCE-Tabellen (die FOREIGN KEY-Beschränkung)

  • Um zu gewährleisten, dass jeder Mitarbeiter eine eindeutige Mitgliedsnummer hat (die UNIQUE-Schlüssel-Beschränkung)

UNIQUE- und NOT NULL-Beschränkungen für den Fremdschlüssel

Wenn beide UNIQUE und NOT NULL-Beschränkungen für den Fremdschlüssel definiert sind, wird nur eine Zeile in der untergeordneten Tabelle auf einen bestimmten übergeordneten Schlüsselwert verweisen, und da NULL-Werte im Fremdschlüssel nicht erlaubt sind, muss jede Zeile in der untergeordneten Tabelle explizit auf einen Wert im übergeordneten Schlüssel verweisen.

Siehe dies:

Oracle 11g Verbindung

52voto

JNK Punkte 60318

1 - Ja, mindestens seit SQL Server 2000.

2 - Ja, solange es sich nicht um eine UNIQUE Einschränkung oder mit einem eindeutigen Index verknüpft.

23voto

Ja Fremdschlüssel kann null sein, wie oben von Senior-Programmierer gesagt... Ich würde ein weiteres Szenario hinzufügen, bei dem der Fremdschlüssel null sein muss: .... Nehmen wir an, wir haben Tabellen Kommentare, Bilder und Videos in einer Anwendung, die Kommentare zu Bildern und Videos erlaubt. In der Tabelle comments können wir zwei Foreign Keys PicturesId und VideosId zusammen mit dem Primärschlüssel CommentId haben. Wenn Sie also ein Video kommentieren, wäre nur VideosId erforderlich und pictureId wäre null... und wenn Sie ein Bild kommentieren, wäre nur PictureId erforderlich und VideosId wäre null...

15voto

shinxg Punkte 442

Es hängt davon ab, welche Rolle diese foreign key in Ihrer Beziehung spielt.

  1. wenn dies foreign key ist auch ein key attribute in Ihrer Beziehung, dann kann es nicht NULL sein
  2. wenn dies foreign key ein normales Attribut in Ihrer Beziehung ist, dann kann es NULL sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X