Bitte klären Sie zwei Dinge für mich:
- Kann ein Fremdschlüssel NULL sein?
- Kann ein Fremdschlüssel dupliziert werden?
Soweit ich weiß, NULL
sollte es nicht in Fremdschlüsseln verwendet werden, aber in einigen meiner Anwendungen kann ich NULL
sowohl in Oracle als auch in SQL Server eingeben , und ich weiß nicht warum.
sql
sql-server
oracle
foreign-keys
Marmeladen
quelle
quelle
Antworten:
Kurze Antwort: Ja, es kann NULL oder doppelt sein.
Ich möchte erklären, warum ein Fremdschlüssel möglicherweise null oder eindeutig oder nicht eindeutig sein muss. Denken Sie zuerst daran, dass ein Fremdschlüssel lediglich erfordert, 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 den Wert noch nicht kennen.
Lassen Sie mich Ihnen ein Beispiel aus dem wirklichen Leben geben. Angenommen, Sie haben eine Datenbank, in der Verkaufsvorschläge gespeichert sind. Angenommen, jedem Angebot sind nur ein Verkäufer und ein Kunde zugeordnet. Ihre Angebotstabelle enthält also zwei Fremdschlüssel, einen mit der Kunden-ID und einen mit der Vertriebsmitarbeiter-ID. Zum Zeitpunkt der Erstellung des Datensatzes wird jedoch nicht immer ein Vertriebsmitarbeiter zugewiesen (da noch niemand daran arbeiten kann), sodass die Kunden-ID ausgefüllt wird, die Vertriebsmitarbeiter-ID jedoch möglicherweise null ist. Mit anderen Worten, normalerweise benötigen Sie die Fähigkeit, eine Null-FK zu haben, wenn Sie den Wert zum Zeitpunkt der Dateneingabe möglicherweise nicht kennen, aber andere Werte in der Tabelle kennen, die eingegeben werden müssen. Um Nullen in einer FK zuzulassen, müssen Sie im Allgemeinen nur Nullen in dem Feld zulassen, in dem sich die FK befindet. Der Nullwert unterscheidet sich von der Vorstellung, dass es sich um einen FK handelt.
Ob es eindeutig ist oder nicht, hängt davon ab, ob die Tabelle eine Eins-Eins- oder eine Eins-Viele-Beziehung zur übergeordneten Tabelle hat. Wenn Sie nun eine Eins-zu-Eins-Beziehung haben, ist es möglich, dass Sie alle Daten in einer Tabelle haben, aber wenn die Tabelle zu breit wird oder wenn sich die Daten auf ein anderes Thema beziehen (das Beispiel für Mitarbeiter - Versicherung @tbone) zum Beispiel), dann möchten Sie separate Tabellen mit einem FK. Sie möchten diese FK dann entweder auch zur PK (die die Eindeutigkeit garantiert) oder zu einer eindeutigen Einschränkung machen.
Die meisten FKs sind für eine Eins-zu-Viele-Beziehung und das ist es, was Sie von einem FK erhalten, ohne eine weitere Einschränkung für das Feld hinzuzufügen. Sie haben also beispielsweise eine Auftragstabelle und die Bestelldetailtabelle. Wenn der Kunde zehn Artikel gleichzeitig bestellt, verfügt er über einen Bestell- und zehn Bestelldetailsätze, die dieselbe Bestell-ID wie der FK enthalten.
quelle
NULL
in einer Tabelle gegen mehrereNULL
s in einer anderen Tabelle getauscht haben .1 - Ja, seit mindestens SQL Server 2000.
2 - Ja, solange es sich nicht um eine
UNIQUE
Einschränkung handelt oder mit einem eindeutigen Index verknüpft ist.quelle
Aus dem Maul des Pferdes:
Sieh dir das an:
Oracle 11g Link
quelle
Ja, Fremdschlüssel können null sein, wie oben von erfahrenen Programmierern angegeben. Ich würde ein weiteres Szenario hinzufügen, in dem Fremdschlüssel null sein müssen. Angenommen, wir haben Tabellenkommentare, Bilder und Videos in einer Anwendung, die Kommentare zu Bildern und Bildern zulässt Videos. In der Kommentartabelle können wir zwei Fremdschlüssel-Bild-ID und Videos-ID zusammen mit der Primärschlüssel-Kommentar-ID haben. Wenn Sie also nur ein Video kommentieren, ist nur die VideosId erforderlich und die Bild-ID wäre null ... und wenn Sie ein Bild kommentieren, ist nur die Bild-ID erforderlich und die Videos-ID wäre null ...
quelle
Es hängt davon ab, welche Rolle dies
foreign key
in Ihrer Beziehung spielt.foreign key
auchkey attribute
in Ihrer Beziehung ist, kann es nicht NULL seinforeign key
ein normales Attribut in Ihrer Beziehung ist, kann es NULL sein.quelle
Hier ist ein Beispiel mit der Oracle-Syntax:
Zuerst erstellen wir eine Tabelle COUNTRY
Erstellen Sie die Tabelle PROVINZ
Dies läuft in Oracle einwandfrei. Beachten Sie, dass der Fremdschlüssel COUNTRY_ID in der zweiten Tabelle nicht "NOT NULL" enthält.
Um nun eine Zeile in die PROVINCE-Tabelle einzufügen, reicht es aus, nur die PROVINCE_ID anzugeben. Wenn Sie jedoch auch eine COUNTRY_ID angeben möchten, muss diese bereits in der COUNTRY-Tabelle vorhanden sein.
quelle
Standardmäßig gibt es keine Einschränkungen für den Fremdschlüssel. Der Fremdschlüssel kann null und doppelt sein.
Wenn Sie beim Erstellen einer Tabelle / Ändern der Tabelle eine Einschränkung der Eindeutigkeit hinzufügen oder nicht null, werden nur die Werte null / duplizieren nicht zugelassen.
quelle
Einfach ausgedrückt, "Nicht identifizierende" Beziehungen zwischen Entitäten sind Teil des ER-Modells und stehen in Microsoft Visio beim Entwerfen des ER-Diagramms zur Verfügung. Dies ist erforderlich, um die Kardinalität zwischen Entitäten vom Typ "Null oder mehr als Null" oder "Null oder Eins" zu erzwingen. Beachten Sie diese "Null" in der Kardinalität anstelle von "Eins" in "Eins zu Viele".
Ein Beispiel für eine nicht identifizierende Beziehung, bei der die Kardinalität "Null" sein kann (nicht identifizierend), ist, wenn wir sagen, dass ein Datensatz / Objekt in einer Entität - A "möglicherweise" oder "möglicherweise nicht" einen Wert als Referenz auf den Datensatz hat / s in einer anderen Entität-B.
Da es eine Möglichkeit gibt, dass sich ein Datensatz von Entität A gegenüber den Datensätzen anderer Entität B identifiziert, sollte in Entität B eine Spalte vorhanden sein, in der der Identitätswert des Datensatzes von Entität B angegeben ist. Diese Spalte kann "Null" sein, wenn kein Datensatz in Entität A den Datensatz (oder die Objekte) in Entität B identifiziert.
Im objektorientierten (realen) Paradigma gibt es Situationen, in denen ein Objekt der Klasse B für seine Existenz nicht unbedingt vom Objekt der Klasse A abhängt (stark gekoppelt ist), was bedeutet, dass die Klasse B lose mit der Klasse A gekoppelt ist Eine solche, dass Klasse-A ein Objekt der Klasse-A "enthalten" (enthalten) kann, im Gegensatz zum Konzept des Objekts der Klasse-B, muss (Zusammensetzung) ein Objekt der Klasse-A haben, für sein (Objekt der Klasse-) B) Schöpfung.
Aus Sicht der SQL-Abfrage können Sie alle Datensätze in Entität B abfragen, die für den für Entität B reservierten Fremdschlüssel "nicht null" sind. Dadurch werden alle Datensätze mit einem bestimmten entsprechenden Wert für Zeilen in Entität-A angezeigt. Alternativ sind alle Datensätze mit dem Wert Null die Datensätze, die in Entität-A in Entität-B keinen Datensatz haben.
quelle
Ich denke, es ist besser, die mögliche Kardinalität zu berücksichtigen, die wir in den Tabellen haben. Wir können eine mögliche minimale Kardinalität von Null haben. Wenn dies optional ist, kann die Mindestbeteiligung von Tupeln aus der zugehörigen Tabelle Null sein. Jetzt müssen Fremdschlüsselwerte auf Null gesetzt werden.
Aber die Antwort ist, dass alles vom Geschäft abhängt.
quelle
Die Idee eines Fremdschlüssels basiert auf dem Konzept, auf einen Wert zu verweisen, der bereits in der Haupttabelle vorhanden ist. Aus diesem Grund wird es in der anderen Tabelle als Fremdschlüssel bezeichnet. Dieses Konzept wird als referenzielle Integrität bezeichnet. Wenn ein Fremdschlüssel als Nullfeld deklariert wird, verstößt er gegen die Logik der referenziellen Integrität. Worauf wird es sich beziehen? Es kann sich nur auf etwas beziehen, das in der Haupttabelle vorhanden ist. Daher halte ich es für falsch, ein Fremdschlüsselfeld als null zu deklarieren.
quelle
NULL
, aber die referenzielle Integrität besagt, dass es dort sein muss, wenn es auf "etwas" verweist.Ich denke, der Fremdschlüssel einer Tabelle ist auch der Primärschlüssel einer anderen Tabelle. Es werden also keine Nullen zugelassen. Es gibt also keine Frage, ob der Fremdschlüssel einen Nullwert enthält.
quelle