Fremdschlüssel, der auch Null sein kann

8

Wenn ich Fremdschlüssel in MySQL verwende, erhalte ich einen Fehler, wenn der Quellwert 0 ist (weil es keinen Zieldatensatz mit der ID 0 gibt). Daher ändere ich die Quellspalte auf NULL, und dann funktioniert es. Ich bin mir jedoch nicht sicher, ob dies der richtige Weg ist. Ist es der richtige Weg, oder kann ich irgendwie die Quell-ID auf 0 statt auf NULL setzen?

    
user 18.03.2012, 15:11
quelle

4 Antworten

19

Fremdschlüssel sind Einschränkungen. Das bedeutet, wenn der Wert der Spalte, die den Fremdschlüssel hat, auf irgendwas gesetzt ist (und "irgendetwas" NULL nicht enthält), muss dieser Wert in der referenzierten Tabelle vorhanden sein oder MySQL wird einen Fehler ausgeben.

Kurz gesagt, Sie können entweder den Wert auf NULL setzen, die Fremdschlüsseleinschränkung entfernen und den Wert auf den gewünschten Wert setzen, einschließlich 0 , oder einen Datensatz mit einem 0 im referenzierten Objekt hinzufügen Tabelle. Von diesen Optionen scheint der Wert auf NULL am saubersten zu sein.

    
Joe Lencioni 18.03.2012, 15:14
quelle
4

Es ist der richtige Weg. 0 ist ein Wert und null sagt, dass in der Spalte nichts ist.

    
elrado 18.03.2012 15:15
quelle
3

Ja, das ist der richtige Weg. Der ganze Sinn eines FK besteht darin, zu erzwingen, dass ein Datensatz mit der referenzierten ID tatsächlich existiert. Wenn Sie also die FK-Spalte auf 0 setzen, muss ein Datensatz mit der ID 0 vorhanden sein.

Der einzige Weg, um dies zu erreichen, ist, die FK-Spalte wie bisher NULL-fähig zu machen.

Warum sollten Sie die FK-Spalte auf 0 setzen? Der kanonische Wert für "existiert nicht" in SQL ist NULL.

    
sleske 18.03.2012 15:15
quelle
3

mit einem NULL ist aus zwei Gründen besser als Null. Erstens ist es klarer, dass es sich um einen "speziellen" Wert handelt (es gibt nichts, was bewirkt, dass Tabellen-IDs immer ungleich Null sind, obwohl dies häufig bei automatisch generierten IDs der Fall ist) / p>

Was Sie tun, ist gängige Praxis - viele Leute verwenden NULL als eine Markierung, die "fehlenden Wert" sagt, und das ist, was die SQL-Fremdschlüsselbedingung erwartet.

Eine weitere Möglichkeit, mit fehlenden Werten umzugehen, besteht darin, eine dritte "Link" -Tabelle zu verwenden, die nur dann einen Eintrag enthält, wenn eine Verbindung zwischen den beiden Klassen besteht (wie in einer Viele-zu-Viele-Beziehung). dies vermeidet die Notwendigkeit eines NULL und wird daher von einigen Datenbank-Puristen bevorzugt, macht aber alles komplexer. Weitere Informationen finden Sie unter Nulable Foreign Key Bad Practice? .

    
andrew cooke 18.03.2012 15:17
quelle

Tags und Links