Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Fremdschlüssel zwischen zwei Tabellen ändern

Frage Entwicklung Datenbanken

Mitglied: simon-ni

simon-ni (Level 1) - Jetzt verbinden

17.04.2013 um 16:12 Uhr, 3357 Aufrufe, 2 Kommentare

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.

01.
ALTER TABLE `berufsbezeichnung` ADD FOREIGN KEY ( `ID` ) REFERENCES `intranet`.`azubi` (`fk_berufsbezeichnung` ) ON DELETE CASCADE ON UPDATE RESTRICT ; 
02.
  
03.
#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
Mitglied: Biber
18.04.2013, aktualisiert um 16:21 Uhr
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
Bitte warten ..
Mitglied: simon-ni
19.04.2013 um 12:16 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Off Topic

"Ich habe nichts zu verbergen"

(2)

Erfahrungsbericht von FA-jka zum Thema Off Topic ...

Ähnliche Inhalte
Microsoft Office
Access Verknüpfte Tabellen Passwort ändern

Frage von mijacd zum Thema Microsoft Office ...

Switche und Hubs
gelöst LAG zwischen SG300-Switches macht Probleme. Wer weiß Rat? (26)

Frage von White-Rabbit2 zum Thema Switche und Hubs ...

Grafikkarten & Monitore
Intel User Interface - Sprache ändern (4)

Frage von FA-jka zum Thema Grafikkarten & Monitore ...

DSL, VDSL
gelöst LAN Kabel zwischen DSL-Anschluss und Modem (8)

Frage von MegaGiga zum Thema DSL, VDSL ...

Heiß diskutierte Inhalte
CPU, RAM, Mainboards
Kaufberatung für mind. 8 verschiedene HighEnd-Mainboards (23)

Frage von yperiu zum Thema CPU, RAM, Mainboards ...

Mac OS X
Mac kann nicht im LAN pingen alle anderen schon (19)

Frage von smartino zum Thema Mac OS X ...

Hyper-V
Langsames Netzwerk i210 LAN Karte (10)

Frage von Akcent zum Thema Hyper-V ...

Netzwerke
Abisolierwerkzeug (10)

Frage von SarekHL zum Thema Netzwerke ...