Was ist der Zweck von SET NULL in Einschränkungen zum Löschen / Aktualisieren von Fremdschlüsseln?

15

Ich bin wahrscheinlich engstirnig, aber wenn ich eine Fremdschlüsseleinschränkung erstelle und eine Zeile aktualisiert oder gelöscht wird, verliere ich diese Verbindung, wenn die Spalte der untergeordneten Tabelle auf NULL gesetzt wird.

Was ist der Zweck, diese verwaisten Reihen absichtlich zu behalten?

Derek Downey
quelle
Ich suche nach Anwendungsfällen und glaube nicht, dass sie datenbankspezifisch sind (könnte hier falsch sein)
Derek Downey
Ich habe auch noch nie einen Anwendungsfall dafür gesehen ...
a_horse_with_no_name

Antworten:

13

Ob dies set nullsinnvoll ist oder nicht, hängt davon ab, was Sie nullim jeweiligen Kontext gemeint haben - bei aller Verwirrung und Meinung um nullIMO ist der DBA der vernünftige Ansprechpartner

  1. Wählen Sie (und dokumentieren Sie), was es für jedes nullfähige Feld bedeutet
  2. Stellen Sie sicher, dass es nur eine Sache bedeutet

Berücksichtigen Sie bei diesen Regeln den folgenden Anwendungsfall:

  • Sie haben einen Tisch "Shop" (zB einzelne Räumlichkeiten)
  • Sie haben eine Tabelle "Einzelhändler" (zB Ketten)
  • Die Tabelle "Shop" enthält ein Suchfeld, das auf den Schlüssel "Einzelhändler" verweist.
  • Sie haben festgelegt null, dass ein unabhängiger Shop dargestellt werden soll (dh einer, der nicht Teil einer Kette ist).
  • Ein "Einzelhändler" schließt Filialen so lange, bis Sie die Geschäfte als unabhängig betrachten

In diesem Fall on delete set nullmacht ein Sinn. Es gibt andere Möglichkeiten, diese Geschäftsregeln zu modellieren, aber dies ist die einfachste, und wenn sie genau zu den Tatsachen passen, die Sie in der realen Welt interessieren, schlage ich vor, dass dies vollkommen in Ordnung ist

Jack Douglas
quelle
Gute Punkte mit einer strengen Bedeutung von null, und mit Ihrem Beispiel ist klar, warum dies eine Funktion ist.
Derek Downey
1

Die meisten Anwendungsfälle, die mir im Allgemeinen einfallen, haben die Form "Nun, wir könnten etwas anderes machen, aber wir wollten dies stattdessen tun".

Betrachten Sie ein ownerFeld für einen Fehler in einem Fehlerverfolgungssystem eines Unternehmens. Wenn John kündigt, sollten sicherlich nicht alle seine Probleme einfach gelöscht werden, wenn sein Konto entfernt wird. Selbst dann erlauben einige Datenbanken, dass SET DEFAULTeine Aktion (oder ein Trigger dieselbe Aufgabe ausführt) und ein NobodyMitarbeiter der Standardeigner von Problemen ist, eine Option. Oder wir könnten ein disabledFeld für John haben, anstatt seinen Datensatz zu löschen.

DerfK
quelle
3
In diesem Fall würde ich argumentieren, deletes ( RESTRICT) nicht zuzulassen , wenn aus keinem anderen Grund die Schuld auf einen alten Mitarbeiter gerichtet wird, wenn etwas schief geht!
Derek Downey