Beim Durchsuchen einer Datenbank stieß ich auf eine Tabelle, die ihren Primärschlüssel als Fremdschlüssel für sich selbst verwendete.
Ich habe gesehen, dass eine Tabelle einen Fremdschlüssel für sich selbst haben kann, um eine Hierarchiestruktur zu erstellen, aber eine andere Spalte verwenden würde, um auf den Primärschlüssel zu verweisen.
Da der Primärschlüssel eindeutig ist, kann die Zeile in dieser Situation nicht nur auf sich selbst verweisen. Das scheint eine tautologische Verbindung zu sein, denn wenn ich schon die Reihe habe, dann habe ich schon die Reihe.
Gibt es einen Grund dafür?
Ich bin sicher, dass die Einschränkung so geschrieben ist (nicht nur im Diagramm), da für beide Hälften der Definition dieselbe Tabelle und Spalte verwendet wird.
quelle
Antworten:
Wie du gesagt hast. Eine
FOREIGN KEY
Einschränkung, die auf dieselbe Tabelle verweist, gilt normalerweise für eine Hierarchiestruktur und verwendet eine andere Spalte, um auf den Primärschlüssel zu verweisen. Ein gutes Beispiel ist eine Tabelle mit Mitarbeitern:In diesem Fall gibt es also einen Fremdschlüssel von der Tabelle zurück in sich. Alle Manager sind auch Angestellte, also
ManagerId
ist das eigentlich dasEmployeeId
des Managers.Wenn Sie andererseits meinen, dass jemand den
EmployeeId
als Fremdschlüssel für die Employee-Tabelle verwendet hat , war dies wahrscheinlich ein Fehler . Ich habe einen Test durchgeführt und es ist möglich, aber es hätte keinen wirklichen Nutzen.quelle
Ich habe gerade einen solchen Fremdschlüssel in meiner eigenen Datenbank gefunden und es muss ich selbst gemacht haben. Ich denke, das ist zufällig passiert. Wenn ich im Kontextmenü einer Tabelle mit Primärschlüssel (in Management Studio, SQL 2014 Express) auf "Neuer Fremdschlüssel" klicke, wird automatisch ein solcher Fremdschlüssel erstellt, der auf sich selbst verweist. Siehe unten:
Wenn ich dann nicht merke, dass ich dieses ändern sollte, anstatt ein neues hinzuzufügen, bleibt es dort. Oder wenn ich einfach auf die Schaltfläche [Schließen] klicke, was bedeutet, dass dies wie ein [Abbrechen] wäre, wird der Fremdschlüssel nach dem Speichern der Tabellendefinition immer noch erstellt.
Ein solcher Fremdschlüssel macht für mich also keinen Sinn und kann entfernt werden.
quelle
Vielleicht wollte der Designer die Verwendung von deaktivieren
TRUNCATE TABLE
?TRUNCATE TABLE
kann nicht für eine Tabelle mit einer Fremdschlüsseleinschränkung für eine andere Tabelle verwendet werden , kann jedoch verwendet werden, wenn selbstreferenzielle Fremdschlüssel vorhanden sind. Aus der Dokumentation zu TRUNCATE TABLE (Transact-SQL) :Eine
DELETE
Anweisung ohneWHERE
Klausel hat eine ähnliche Wirkung wie aTRUNCATE TABLE
(alle Zeilen in der Tabelle entfernen), aber dieDELETE
Anweisung löst Löschauslöser aus, was möglicherweise ein Grund ist, dies zuzulassen,DELETE
aber nichtTRUNCATE TABLE
.Ich würde dies mit Berechtigungen tun (
DELETE
Löschberechtigung erforderlich, Berechtigung zumTRUNCATE TABLE
Ändern der Tabelle erforderlich), aber vielleicht gibt es einen Grund, warum der Designer dies nicht tun konnte?Hinweis: Auch wenn das, was der Designer getan hat, die Verwendung von nicht deaktiviert
TRUNCATE TABLE
, spekuliere ich immer noch, dass dies ihre Absicht war.quelle