Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Fremdschlüssel wird nicht erkannt

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Col. John Hannibal Smith, 9 September 2016.

  1. Hallo, ich habe momentan das Problem, dass ich 2 Tabellen (kunden und auftraege) verknüpfen möchte.
    Und zwar soll die Spalte "Auftraggeber" aus "auftraege" auf "Firma" in der Tabelle "Kunden" verweisen. Beide sind als varchar(32) gesetzt.
    Folgenden Code habe ich verwendet:
    Code:
    ALTER TABLE `auftraege` ADD  FOREIGN KEY (`Auftraggeber`) REFERENCES `kunden`(`Firma`) ON DELETE SET NULL ON UPDATE SET NULL;
    Allerdings kommt dann "#1215 - Fremdschlüssel-Beschränkung kann nicht hinzugefügt werden". Wieso denn das?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Hat kunden einen PK auf der Spalte?
     
  3. akretschmer

    akretschmer Datenbank-Guru

    weitere Frage: wären denn der FK-Constraint valid?
     
  4. ja, PK besteht.
    Ehm, was ist denn der FK-Constraint?
    Sorry bin noch einigermaßen neu in dem ganzen, arbeite das erste Mal mit Fremdschlüsseln
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Angenommen, Du hast bereits deine Aufträge:

    Code:
    test=*# select * from auftraege ;
     ku | jahr
    ----+------
      1 |  10
      2 |  20
    (2 Zeilen)
    
    Nun erstelle ich eine Kundentabelle, welche leer ist:

    Code:
    test=*# create table kunde(id int unique, name text);
    CREATE TABLE
    
    Was passiert, wenn ich jetzt den Constraint erstellen will? Schaue wir mal...

    Code:
    test=*# alter table auftraege add foreign key (ku) references kunde(id) on delete set null on update set null;
    FEHLER:  Einfügen oder Aktualisieren in Tabelle »auftraege« verletzt Fremdschlüssel-Constraint »auftraege_ku_fkey«
    DETAIL:  Schlüssel (ku)=(1) ist nicht in Tabelle »kunde« vorhanden.
    
    Logisch, oder?

    Die Fehlermeldungen von MySQL sind nicht annähernd so gut wie die von PG, möglicherweise ist das aber die Ursache. Generell rate ich von der Benutzung von MySQL ab.
     
  6. Okay... aber mein "Auftraggeber" existiert ja in der Tabelle, ebenso wie auch Aufträge existieren...
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Tja, dann, ... MySQL. Es schweigt sich halt aus, warum es das nicht setzen kann. Siehe mein letzter Satz im letzten Posting von mir.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Darf die Spalte NULL werden? Nutzt Du InnoDB?
     
  9. ukulele

    ukulele Datenbank-Guru

    Du kannst leicht prüfen ob deine Daten die Bedingung des Fremdschlüssels erfüllen. Dieser Select sollte keine Ergebnisse liefern, tut er es doch, fehlen dir Einträge in Kunden oder die Schreibweisen stimmen nicht überein.
    Code:
    SELECT * FROM Auftraege WHERE Auftraggeber IS NOT NULL AND Auftraggeber NOT IN ( SELECT Firma FROM Kunden )
     
  10. Nein, darf nicht. Ich nutze PHPmyAdmin bzw Navicat.
    Ja, es wird mir nichts angezeigt.

    Seltsam das alles.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    was ist mit meinen 2 anderen Fragen?
     
  12. Ups, falschen Beitrag zitiert. Habs oben editiert,
    Die Spalten dürfen beide nicht NULL werden, und ich nutze PHPmyAdmin bzw Navicat.
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Ja, wenn sie nicht NULL werden dürfen und Du definierst ON DELETE SET NULL dann gibt es da einen Konflikt.

    PMA / Navicat sind Client-Programme, die haben exakt NIX mit internen Problemen der Datenbank zu tun - und davon hat MySQL mehr als genug.
     
  14. Okay, allerdings wenn ich nicht SET NULL sondern NO ACTION oder CASCADE oder alles andere mache, geht es auch nicht...
     
  15. akretschmer

    akretschmer Datenbank-Guru

    Gut. Was ist mit der anderen Frage?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden