Umgang mit Zirkelverweisen bei der Eingabe von Daten in SQL

7

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?

    
Tom 05.06.2009, 12:53
quelle

9 Antworten

5

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:

  • (Autocommit muss deaktiviert sein)
  • verschiebt die Durchsetzung der Fremdschlüsseleinschränkung
  • fügen Sie eine Zeile in die Abteilungstabelle mit einem "Dummy" -Wert für die FK-Spalte
  • ein
  • fügen Sie eine Zeile in die Employee-Tabelle mit FK-Referenz zu Department
  • ein
  • Ersetzen Sie den "Dummy" -Wert in der Abteilung FK durch eine echte Referenz
  • Aktivieren Sie die Durchsetzung der Einschränkungen erneut

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]

    
spencer7593 05.06.2009, 16:23
quelle
13
___ answer95569 ___

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.

    
___ answer955818 ___

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)

    
___ answer955695 ___

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.

    
___ answer955689 ___

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.

    
___ qstnhdr ___ Umgang mit Zirkelverweisen bei der Eingabe von Daten in SQL ___ answer956818 ___

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:

  • (Autocommit muss deaktiviert sein)
  • verschiebt die Durchsetzung der Fremdschlüsseleinschränkung
  • fügen Sie eine Zeile in die Abteilungstabelle mit einem "Dummy" -Wert für die FK-Spalte
  • ein
  • fügen Sie eine Zeile in die Employee-Tabelle mit FK-Referenz zu Department
  • ein
  • Ersetzen Sie den "Dummy" -Wert in der Abteilung FK durch eine echte Referenz
  • Aktivieren Sie die Durchsetzung der Einschränkungen erneut

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]

    
___ answer955742 ___

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

  1. Erstellen Sie den Mitarbeiter (MitarbeiterA) in der Abteilung 'Nicht zugewiesen'
  2. Erstellen Sie die neue Abteilung (DepartmentA) mit dem Mitarbeiter EmployeeA
  3. Aktualisieren Sie EmployeeA in AbteilungA

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

    
___ answer956096 ___

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.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ qstntxt ___

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?

    
___ answer955685 ___

Ja, in diesem Fall müssen Sie einen Fremdschlüssel deaktivieren.

    
___ answer955696 ___

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.

    
___
chaos 05.06.2009 12:57
quelle
3

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)

    
Erich Kitzmueller 05.06.2009 13:20
quelle
1

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.

    
Sung 05.06.2009 12:56
quelle
1

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.

    
Bob 05.06.2009 12:57
quelle
1

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

  1. Erstellen Sie den Mitarbeiter (MitarbeiterA) in der Abteilung 'Nicht zugewiesen'
  2. Erstellen Sie die neue Abteilung (DepartmentA) mit dem Mitarbeiter EmployeeA
  3. Aktualisieren Sie EmployeeA in AbteilungA

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

    
Patrick McDonald 05.06.2009 13:06
quelle
1

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.

    
Cade Roux 05.06.2009 14:15
quelle
0

Ja, in diesem Fall müssen Sie einen Fremdschlüssel deaktivieren.

    
kemiller2002 05.06.2009 12:56
quelle
0

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.

    
HLGEM 05.06.2009 12:57
quelle

Tags und Links