Ich nehme an, Ihre Departments.EmployeeID ist ein Abteilungsleiter. Was ich tun würde, ist, dass diese Spalte nullfähig ist; Dann können Sie zuerst die Abteilung und dann den Mitarbeiter erstellen.
Welche Art von SQL-Tricks verwenden Sie, um Daten in zwei Tabellen mit einer zirkulären Referenz dazwischen einzugeben?
%Vor%Der Mitarbeiter gehört zu einer Abteilung, eine Abteilung muss einen Manager (Abteilungsleiter) haben.
Muss ich Einschränkungen für die Einfügung deaktivieren?
F: Muss ich die Einschränkungen für die Einfügung deaktivieren?
A: In Oracle nein, nicht, wenn die Fremdschlüsseleinschränkungen% co_de sind % (siehe Beispiel unten)
Für Oracle:
%Vor%Lass uns das auspacken:
HINWEISE: Das Deaktivieren einer Fremdschlüsseleinschränkung wirkt sich auf ALLE Sitzungen aus. DEFERRING einer Einschränkung erfolgt auf Transaktionsebene (wie im Beispiel) oder auf Sitzungsebene ( DEFERRABLE
)
Oracle hat zugelassen, dass Fremdschlüsseleinschränkungen für mindestens ein Jahrzehnt als DEFERRABLE definiert werden. Ich definiere alle Fremdschlüsselbeschränkungen (selbstverständlich), um anfänglich sofort ungültig zu werden. Das behält das Standardverhalten bei, wie es alle erwarten, ermöglicht jedoch die Bearbeitung, ohne dass Fremdschlüssel deaktiviert werden müssen.
siehe AskTom: Ссылка
siehe AskTom: Ссылка
Siehe auch: Ссылка
[BEARBEITEN]
A: In Microsoft SQL Server können Sie Fremdschlüsseleinschränkungen nicht wie in Oracle verzögern. Das Deaktivieren und erneute Aktivieren der Fremdschlüsseleinschränkung ist ein Ansatz, aber ich schaudere bei der Aussicht auf 1) Leistungseinfluss (die Fremdschlüsseleinschränkung wird auf die GESAMTE Tabelle geprüft, wenn die Einschränkung erneut aktiviert wird), 2) Behandeln der Ausnahme falls (Wann?) Die erneute Aktivierung der Einschränkung schlägt fehl. Beachten Sie, dass das Deaktivieren der Einschränkung sich auf alle Sitzungen auswirkt. Während also die Einschränkung deaktiviert ist, können andere Sitzungen möglicherweise Zeilen einfügen und aktualisieren, wodurch das erneute Aktivieren der Einschränkung fehlschlägt.
Bei SQL Server ist es besser, die NOT NULL-Einschränkung zu entfernen und NULL als temporären Platzhalter zuzulassen, während Zeilen eingefügt / aktualisiert werden.
Für SQL Server:
%Vor%[/ EDIT]
Ich nehme an, Ihre Departments.EmployeeID ist ein Abteilungsleiter. Was ich tun würde, ist, dass diese Spalte nullfähig ist; Dann können Sie zuerst die Abteilung und dann den Mitarbeiter erstellen.
Dieses Problem könnte mit einschränkbaren Einschränkungen gelöst werden. Solche Einschränkungen werden geprüft, wenn die gesamte Transaktion festgeschrieben wird. Dies ermöglicht Ihnen, Mitarbeiter und Abteilung in derselben Transaktion einzufügen und sich aufeinander zu beziehen. (Angenommen, das Datenmodell macht Sinn)
Ich kann mir keinen nicht-hackischen Weg vorstellen, dies zu tun. Ich denke, dass Sie die Einschränkung entfernen müssen oder irgendeine Art dumme Dummy-Werte tun müssen, die nach allen Einfügungen aktualisiert werden.
Ich würde empfehlen, das DB-Schema zu refaktorieren. Ich kann mir keine Gründe vorstellen, warum Sie möchten, dass es so funktioniert.
Vielleicht etwas wie Mitarbeiter, Mitarbeiterabteilung (EmployeeId, DepartmentId) und Abteilung wäre ein besserer Weg, um das gleiche Ziel zu erreichen.
Refaktorieren Sie das Schema, indem Sie den Zirkelverweis entfernen.
Löschen Sie eine ID-Spalte aus einem der Tabellenschemas.
Departments.EmployeeID scheint meiner Meinung nach nicht dazuzugehören.
F: Muss ich die Einschränkungen für die Einfügung deaktivieren?
A: In Oracle nein, nicht, wenn die Fremdschlüsseleinschränkungen% co_de sind % (siehe Beispiel unten)
Für Oracle:
%Vor%Lass uns das auspacken:
HINWEISE: Das Deaktivieren einer Fremdschlüsseleinschränkung wirkt sich auf ALLE Sitzungen aus. DEFERRING einer Einschränkung erfolgt auf Transaktionsebene (wie im Beispiel) oder auf Sitzungsebene ( %code% )
Oracle hat zugelassen, dass Fremdschlüsseleinschränkungen für mindestens ein Jahrzehnt als DEFERRABLE definiert werden. Ich definiere alle Fremdschlüsselbeschränkungen (selbstverständlich), um anfänglich sofort ungültig zu werden. Das behält das Standardverhalten bei, wie es alle erwarten, ermöglicht jedoch die Bearbeitung, ohne dass Fremdschlüssel deaktiviert werden müssen.
siehe AskTom: Ссылка
siehe AskTom: Ссылка
Siehe auch: Ссылка
[BEARBEITEN]
A: In Microsoft SQL Server können Sie Fremdschlüsseleinschränkungen nicht wie in Oracle verzögern. Das Deaktivieren und erneute Aktivieren der Fremdschlüsseleinschränkung ist ein Ansatz, aber ich schaudere bei der Aussicht auf 1) Leistungseinfluss (die Fremdschlüsseleinschränkung wird auf die GESAMTE Tabelle geprüft, wenn die Einschränkung erneut aktiviert wird), 2) Behandeln der Ausnahme falls (Wann?) Die erneute Aktivierung der Einschränkung schlägt fehl. Beachten Sie, dass das Deaktivieren der Einschränkung sich auf alle Sitzungen auswirkt. Während also die Einschränkung deaktiviert ist, können andere Sitzungen möglicherweise Zeilen einfügen und aktualisieren, wodurch das erneute Aktivieren der Einschränkung fehlschlägt.
Bei SQL Server ist es besser, die NOT NULL-Einschränkung zu entfernen und NULL als temporären Platzhalter zuzulassen, während Zeilen eingefügt / aktualisiert werden.
Für SQL Server:
%Vor%[/ EDIT]
Sie könnten eine Zeile in der Abteilungstabelle für 'Nicht zugewiesen' erstellen
Um eine neue Abteilung mit einem neuen Mitarbeiter zu erstellen, würden Sie dann
Dies würde Ihr aktuelles Schema nicht ungültig machen, und Sie könnten eine Aufgabe einrichten, die regelmäßig ausgeführt wird, um zu überprüfen, dass es keine Mitglieder der nicht zugewiesenen Abteilung gibt.
Sie müssten auch einen Standardmitarbeiter erstellen, der Mitarbeiter von Nicht zugewiesen ist
BEARBEITEN:
Die vom Chaos vorgeschlagene Lösung ist jedoch viel einfacher
Es gibt ein paar gute Designs, die ich benutzt habe. Sie müssen die "EmployeeID" des "Managers" aus der Tabelle Department entfernen und die DepartmentID aus der Employee-Tabelle entfernen. Ich habe ein paar Antworten gesehen, die es erwähnen, aber ich werde klarstellen, wie wir es benutzt haben:
Normalerweise habe ich eine EmployeeDepartment-Beziehungsverknüpfungs-Tabelle - viele zu viele, normalerweise mit Flags wie IsManager, IsPrimaryManager, IsAdmin, IsBackupManager usw., die die Beziehung klären. Einige können eingeschränkt sein, so dass nur ein Primary Manager erlaubt ist Abteilung (obwohl eine Person ein PrimaryManager mehrerer Abteilungen sein kann). Wenn Ihnen die einzelne Tabelle nicht gefällt, können Sie mehrere Tabellen haben: Mitarbeiterabteilung, Managerabteilung, aber dann könnten Sie Situationen haben, in denen eine Person ein Manager ist, aber kein Mitarbeiter usw.
Wir haben es auch typischerweise Personen erlaubt, Mitglieder mehrerer Abteilungen zu sein.
Für einen vereinfachten Zugriff können Sie Ansichten bereitstellen, die den Join entsprechend ausführen.
Welche Art von SQL-Tricks verwenden Sie, um Daten in zwei Tabellen mit einer zirkulären Referenz dazwischen einzugeben?
%Vor%Der Mitarbeiter gehört zu einer Abteilung, eine Abteilung muss einen Manager (Abteilungsleiter) haben.
Muss ich Einschränkungen für die Einfügung deaktivieren?
Ja, in diesem Fall müssen Sie einen Fremdschlüssel deaktivieren.
Sie müssen die eine oder andere Referenz dauerhaft loswerden. Dies ist keine tragfähige Designstruktur. Was muss zuerst eingegeben werden? Abteilung oder Mitarbeiter? Wenn Ihre Abteilungen nicht alle einen Mitarbeiter groß sind, macht die Struktur sowieso keinen Sinn, da jeder Mitarbeiter eine eigene Abteilung haben müsste.
Dieses Problem könnte mit einschränkbaren Einschränkungen gelöst werden. Solche Einschränkungen werden geprüft, wenn die gesamte Transaktion festgeschrieben wird. Dies ermöglicht Ihnen, Mitarbeiter und Abteilung in derselben Transaktion einzufügen und sich aufeinander zu beziehen. (Angenommen, das Datenmodell macht Sinn)
Ich kann mir keinen nicht-hackischen Weg vorstellen, dies zu tun. Ich denke, dass Sie die Einschränkung entfernen müssen oder irgendeine Art dumme Dummy-Werte tun müssen, die nach allen Einfügungen aktualisiert werden.
Ich würde empfehlen, das DB-Schema zu refaktorieren. Ich kann mir keine Gründe vorstellen, warum Sie möchten, dass es so funktioniert.
Vielleicht etwas wie Mitarbeiter, Mitarbeiterabteilung (EmployeeId, DepartmentId) und Abteilung wäre ein besserer Weg, um das gleiche Ziel zu erreichen.
Sie könnten eine Zeile in der Abteilungstabelle für 'Nicht zugewiesen' erstellen
Um eine neue Abteilung mit einem neuen Mitarbeiter zu erstellen, würden Sie dann
Dies würde Ihr aktuelles Schema nicht ungültig machen, und Sie könnten eine Aufgabe einrichten, die regelmäßig ausgeführt wird, um zu überprüfen, dass es keine Mitglieder der nicht zugewiesenen Abteilung gibt.
Sie müssten auch einen Standardmitarbeiter erstellen, der Mitarbeiter von Nicht zugewiesen ist
BEARBEITEN:
Die vom Chaos vorgeschlagene Lösung ist jedoch viel einfacher
Es gibt ein paar gute Designs, die ich benutzt habe. Sie müssen die "EmployeeID" des "Managers" aus der Tabelle Department entfernen und die DepartmentID aus der Employee-Tabelle entfernen. Ich habe ein paar Antworten gesehen, die es erwähnen, aber ich werde klarstellen, wie wir es benutzt haben:
Normalerweise habe ich eine EmployeeDepartment-Beziehungsverknüpfungs-Tabelle - viele zu viele, normalerweise mit Flags wie IsManager, IsPrimaryManager, IsAdmin, IsBackupManager usw., die die Beziehung klären. Einige können eingeschränkt sein, so dass nur ein Primary Manager erlaubt ist Abteilung (obwohl eine Person ein PrimaryManager mehrerer Abteilungen sein kann). Wenn Ihnen die einzelne Tabelle nicht gefällt, können Sie mehrere Tabellen haben: Mitarbeiterabteilung, Managerabteilung, aber dann könnten Sie Situationen haben, in denen eine Person ein Manager ist, aber kein Mitarbeiter usw.
Wir haben es auch typischerweise Personen erlaubt, Mitglieder mehrerer Abteilungen zu sein.
Für einen vereinfachten Zugriff können Sie Ansichten bereitstellen, die den Join entsprechend ausführen.
Ja, in diesem Fall müssen Sie einen Fremdschlüssel deaktivieren.
Sie müssen die eine oder andere Referenz dauerhaft loswerden. Dies ist keine tragfähige Designstruktur. Was muss zuerst eingegeben werden? Abteilung oder Mitarbeiter? Wenn Ihre Abteilungen nicht alle einen Mitarbeiter groß sind, macht die Struktur sowieso keinen Sinn, da jeder Mitarbeiter eine eigene Abteilung haben müsste.
Tags und Links sql