Fremdschlüssel wird nicht erkannt

Beiträge
12
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?
 
Werbung:
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.
 
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 )
 
Darf die Spalte NULL werden? Nutzt Du InnoDB?
Nein, darf nicht. Ich nutze PHPmyAdmin bzw Navicat.
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 )
Ja, es wird mir nichts angezeigt.

Seltsam das alles.
 
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.
 
Werbung:
Zurück
Oben