WernerK: Inhalt von Foreign Key Spalten ändern

Hallo,

in einer SQL Server DB gibt es 3 Tabellen die bei einer Spalte (COMPANY_ID) eine Foreign Key Beziehung haben. Momentan steht in allen Tabellen der Wert "XYZ" drin. Wenn ich diese Spalte nun in einer Tabelle ändern möchtw auf z.b. "123", dann kommt eine Fehlermeldung wegen Foreign Key Beschränkung.

Wie kann man denn nachträglich diese Werte ändern? Müsste man die Tabellen erst leeren?

Gruss

Werner

  1. Tach!

    Wenn ich diese Spalte nun in einer Tabelle ändern möchtw auf z.b. "123", dann kommt eine Fehlermeldung wegen Foreign Key Beschränkung. Wie kann man denn nachträglich diese Werte ändern?

    So, dass die referenzielle Integrität gewahrt bleibt. Du kannst in der abhängigne Tabelle nur Werte eintragen, die es auch in der anderen Tabelle gibt. Beides gleichzeitig ändern geht da also nicht. Du brauchst ja zwei Updates in in dem Momant dazwischen ist die Integrität verletzt.

    Müsste man die Tabellen erst leeren?

    Je nach Konfiguration kann man auch NULL eintragen, dann den Master ändern und anschließend den NULL-Wert anpassen.

    Der SQL Server kennt aber auch die Möglichkeit, die Integritätsprüfung (vorübergehend) auszuschalten, dann gehts ohne Umstände. Suchstichwörter: "sql server turn off integrity checking"

    dedlfix.

  2. Hallo WernerK,

    neben den von dedlfix genannten Möglichkeiten gibt es auch Optionen, die Du an der Beziehung selbst setzen kannst und die für diese Beziehung ständig gelten.

    • Du kannst den Foreign Key so definieren, dass der Server ihn generell nicht erzwingen soll (Enforce Foreign Key Constraint). Warum sollte man das tun? Entweder weil man gerne dokumentiert, oder wegen Punkt 2…

    • Du kannst den Foreign Key so definieren, dass Änderungen in der Primary-Table sich auf die abhängigen Tabellen auswirken. Es gibt 4 Möglichkeiten, jeweils für DELETE und UPDATE in der Primary Table

      • No Action: Der Server tut nichts, außer zu meckern wenn Enforce an ist
      • Set Null: Der Server setzt die Foreign-Key Spalte in den abhängigen Tabellen auf NULL, wenn Du in der Primary-Table den Wert änderst oder die Row löschst
      • Set Default: ähnlich null, setzt aber den Column-Default als Wert. Das funktioniert natürlich nur dann sinnvoll, wenn entweder Enforce aus ist oder der Column-Default der Foreign-Key Spalte in der Primary Table als Key existiert.
      • Cascade: Übertrage die Aktion der Primary Table in die abhängige Table. D.h. ein Update des Key updated den Foreign-Key Wert, ein Delete der Primary-Row löscht die abhängigen Rows

    Was Du davon brauchen kannst, hängt von Deiner Anwendung ab und deiner Lust auf Footguns. Ein Cascade Delete kann üble Folgen haben, wenn man an seine Existenz nicht denkt und vielleicht auch eine Kette von Referenzen hat.

    Rolf

    --
    sumpsi - posui - clusi