foreign key constraint fails

foreign key constraint fails

am 01.03.2006 14:49:38 von Guido Schmidt

Hallo,

folgende Tabellenstruktur (InnoDB)

Tabelle kunden
kdnr | name
12 | Paul
18 | Max


Tabelle produkte
prod_id | artikelname
17 | tasse
20 | maus
11 | haus
15 | katze


Tabelle favoritenlisten:
fali_id | kdnr | fali_name
1 | 12 | hurz
2 | 12 | purz
3 | 18 | foo
FOREIGN KEY (`kdnr`) REFERENCES `kunden` (`kdnr`) ON UPDATE CASCADE,
FOREIGN KEY (`kdnr`) REFERENCES `kunden` (`kdnr`) ON DELETE CASCADE


Tabelle favoritenlisten_produkte:
fali_id | prod_id
1 | 17
1 | 20
1 | 11
2 | 15
FOREIGN KEY (`fali_id`) REFERENCES `favoritenlisten` (`fali_id`) ON
UPDATE CASCADE,
FOREIGN KEY (`fali_id`) REFERENCES `favoritenlisten` (`fali_id`) ON
DELETE CASCADE
FOREIGN KEY (`prod_id`) REFERENCES `produkte` (`prod_id`) ON UPDATE CASCADE,
FOREIGN KEY (`prod_id`) REFERENCES `produkte` (`prod_id`) ON DELETE CASCADE

Folgendes Statement
DELETE FROM favoritenlisten WHERE kdnr = 12 AND fali_id = 1
sollte nun den Datensatz in favoritenlisten löschen und die 3
dazugehörigen Datensätze in favoritenliste_produkte. Ich ernte mit MySQL
4.0.25 aber immer nur ein "1217 - Cannot delete or update a parent row:
a foreign key constraint fails".

Im Manual heißt es zu dem Fehlercode "You are trying to delete a parent
row that has children, and a foreign key constraint fails. You should
delete the children first." Es ist ja nicht der Sinn von Foreign Keys,
dann doch wieder applikationsseitig für konsistente Daten sorgen zu
müssen. Wo könnte die Ursache liegen?

Danke

Guido

Re: foreign key constraint fails

am 01.03.2006 15:59:03 von Axel Schwenke

Guido Schmidt wrote:

> FOREIGN KEY (`kdnr`) REFERENCES `kunden` (`kdnr`) ON UPDATE CASCADE,
> FOREIGN KEY (`kdnr`) REFERENCES `kunden` (`kdnr`) ON DELETE CASCADE

Falsch! Was du vermutlich willst, ist

FOREIGN KEY (`kdnr`) REFERENCES `kunden` (`kdnr`) ON DELETE CASCADE ON UPDATE CASCADE

> Ich ernte mit MySQL
> 4.0.25 aber immer nur ein "1217 - Cannot delete or update a parent row:
> a foreign key constraint fails".

Logisch. Komplett ausgeschrieben hast du oben folgende Constraints
generiert:

FOREIGN KEY ... ON UPDATE CASCADE ON DELETE RESTRICT
FOREIGN KEY ... ON DELETE CASCADE ON UPDATE RESTRICT

(jede nicht per ON ... spezifizierte Operation wird per Default auf
RESTRICT gesetzt)

Dadurch verhindert immer die eine den CASCADE Effekt der anderen.


XL