simon-ni
Goto Top

Fremdschlüssel zwischen zwei Tabellen ändern

Hallo Liebe Community,

Ich habe folgendes Problem , ich habe zwei Tabellen (vereinfacht dargestellt)

Azubi                 Beruf
ID                |----- ID
fk_beruf <-----|      Beruf


In fk_beruf steht eine ID aus Beruf (über einen Foreign Key gepflegt). Jetzt habe ich eine Anwendung geschrieben die es möglich machen soll die Werte in Beruf zu ändern, also z.B. von Fachinformatiker in Fachinformatiker/-in.

Allerdings habe ich dies beim Anlegen der Tabellen nicht bedacht, weshalb die Standarteinstellung ON DELETE RESTRICT ON UPDATE RESTRICT verwendet wurde.

Beim Versuch UPDATE auf CASCADE zu ändern scheitere ich leider.

Folgende Ausgabe erhalte ich wenn ich die Beziehung über phpmyadmin ändern möchte. Verwendet wird MYSQL.

ALTER TABLE `berufsbezeichnung` ADD FOREIGN KEY ( `ID` ) REFERENCES `intranet`.`azubi` (`fk_berufsbezeichnung` ) ON DELETE CASCADE ON UPDATE RESTRICT ;
 
#1452 - Cannot add or update a child row: a foreign key constraint fails (`intranet`.`#sql-199c_2aa`, CONSTRAINT `#sql-199c_2aa_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `azubi` (`fk_berufsbezeichnung`) ON DELETE CASCADE) 


Leider verstehe ich die Fehlermeldung nicht ganz. Gibt es eine Möglichkeit den Beziehung zu ändern oder zu löschen(es kam eine ähnliche Fehlermeldung als ich das versucht habe) und neu anzulegen.

Danke für eure Hilfe.

Nico

Content-Key: 205170

Url: https://administrator.de/contentid/205170

Printed on: April 20, 2024 at 00:04 o'clock

Member: Biber
Biber Apr 18, 2013 updated at 14:21:02 (UTC)
Goto Top
Moin simon-ni,

ich fürchte, irgendetwas hast du mit den Foreign-Key-Möglichkeiten falls verstanden.

ALTER TABLE `berufsbezeichnung` ADD FOREIGN KEY ( `ID` ) REFERENCES `intranet`.`azubi` > (`fk_berufsbezeichnung` ) ON DELETE CASCADE ON UPDATE RESTRICT ;

Bist du dir sicher, dass du richtig zugeordnet hast, wer denn nun "Parent" und wer "Child" in doeser Beziehung sein sollte?

Vielleicht verstehe ich deine Tabellenstruktur ja falsch, einleuchtend wäre sie IMHO so:

Tabelle "Azubi" mit (u.a.) den Feldern "ID", "Name", ..."fk_berufeID". Wobei "fk_berufe_id" eine Zahl ist.

Inhalt z.B.
4711, "Klaus", 1
4712, "Bärbel", 3
4713, "Karl-Heinz", 1


Tabelle "Beruf" mit den Feldern "ID" (Zahl), "Beruf" (Text) und dem Inhalt
1, "Fachinformatiker"
3, "Opfer"
5, "Zitronenfalter"

Foreignkey-Beziehnung: Tabelle "Azubi" ist "Child" vom "Parent" "Berufe" mit
ALTER TABLE `azubi` ADD FOREIGN KEY ( `fk_berufe_ID` ) REFERENCES `intranet`.`berufe` (`ID` ) ON DELETE RESTRICT ;
  • die "berufe"-Tabellenwerte müssen vorhanden sein, bevor ein gültiger "Azubi"-Datensatz angelegt werden kann, denn
  • jeder Azubi muss eine der vorhandenen "Berufe"-IDs erhalten
  • in der "Berufe"-Tabelle dürfen natürlich auch Datensätze wie ID=5/"Zitronenfalter" sein, die nicht von real existierenden Azubis ausgeübt werden
  • kein Datensatz in "Berufe" darf gelöscht werden, wenn die Berufe-ID noch im Child "Berufe" verwendet wird - das stellt die o.a. Constraint sicher mit ON DELETE RESTRICT

Ein ON DELETE CASCADE dagegen würde bewirken: wenn im Parent "Berufe" der Satz ID=1, Beruf="Fachinformatiker" gelöscht wird, automatich auch alle Child-Sätze in "Azubi" gelöscht werden, die die ID=1 verwenden. Das willst du sicher nicht.

Eine Text-Änderung der ID01 "Fachinformatiker" in "Fachinformatiker/-in" ist vollkommen uninteressant für den definierten Foreign-Key, genau deshalb haben sich doch schlaue Menschen diese Mimik ausgedacht.

Zum Thema "bestehenden Foreign Key ändern mit ALTER" -> nein, geht nicht.
bestehenden FK droppen und neu anlegen.
ALTER TABLE child DROP foreign key xy;ALTER TABLE child Add foreign key xy (childfeld] REFERENCES parenttable (parentfeld) ON DELETE RESTRICT

Wenn ich deine Tabellenstruktur vollkommen falsch verstanden habe, dann beschreibe deine Soll-Mimik bitte mal mit auch je drei Beispielsätzen.

Grüße
Biber
Member: simon-ni
simon-ni Apr 19, 2013 at 10:16:29 (UTC)
Goto Top
Hallo Biber,

du hast das genau richtig verstanden. Ich hab ihn gelöscht und wieder neu angelegt, danach hat es funktioniert.

Ich hab mir auch gedacht das die Anderung unerheblich sein sollte. Warscheinlich ist mir beim Anlegen ein Fehler unterlaufen.

Danke für die ausfürhliche Antwort, das hilft hoffentlich nicht nur mir weiter.

Gruß
Nico