Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Mysteriöses FK-Problem

2 views
Skip to first unread message

Thorsten Kleibaum

unread,
Dec 21, 2009, 2:13:04 PM12/21/09
to
Hallo zusammen,

habe es gerade mit einem etwas mysteriᅵs anmutenden Problem mit einem
Foreign Key zu tun, bei dem ich nicht so recht weiter weiᅵ. Hoffe, Ihr
habt 'nen Tip.

Und zwar habe ich ein Skript geschrieben, das die DB-Struktur meiner
(.NET-)Anwendung von einer zur anderen Version anpaᅵt.

Fᅵhre ich deses Skript ᅵber den MySQL Query Browser aus, lᅵuft alles
wunderbar.

Fᅵhre ich dasselbe Skript ᅵber mein Setup aus, bekomme ich eine
Exception, die mir Fehler 1025 - "Error on rename of '.\\mydb\\article'
to '.\\mydb\\#sql2-ba8-5a' (errno: 152) - anzeigt.

Durch Auskommentieren habe ich den angeblich fehlerhaften Bereich
mittlerweile ausfindig machen kᅵnnen und genau da wird es (fᅵr mich)
mysteriᅵs, denn an der entsprechenden Stelle wird die Tabelle 'article'
nicht angetastet.

Tatsᅵchlich lᅵsche ich an der Stelle zunᅵchst einen Foreign Key
(FK_cb_cs) einer anderen Tabelle, der jedoch auch nichts mit 'article'
zu tun hat, und anschlieᅵend die zugehᅵrige Bezugs-Spalte aus der Tabelle.

Sehe ich mir den 'Last Foreign Key Error' an, so steht zu Beginn:
"Error in dropping of a foreign key constraint of table mydb/article"

Und schlieᅵlich als Fehlermeldung:
"Cannot find a constraint with the given id FK_cb_cs."

Insoweit muᅵ ich InnoDB recht geben - der FK existiert in der Tabelle
'article' nicht.
Doch wieso kommt es zu diesem falschen Bezug? Und wieso nur in meinem
Setup und nicht auch im Query Browser?

Noch kurz ein paar Informationen zu meiner Umgebung:
MySQL 5.0.67 CE
Connector/NET 5.2.5
Query Browser 1.2.12

Frohes Fest und Dank im Voraus
Thorsten

Axel Schwenke

unread,
Dec 22, 2009, 4:15:20 AM12/22/09
to
Thorsten Kleibaum <t...@cityweb.de> wrote:
>
> Und zwar habe ich ein Skript geschrieben, das die DB-Struktur meiner
> (.NET-)Anwendung von einer zur anderen Version anpa�t.
>
> F�hre ich deses Skript �ber den MySQL Query Browser aus, l�uft alles
> wunderbar.
>
> F�hre ich dasselbe Skript �ber mein Setup aus, bekomme ich eine

> Exception, die mir Fehler 1025 - "Error on rename of '.\\mydb\\article'
> to '.\\mydb\\#sql2-ba8-5a' (errno: 152) - anzeigt.

Details, Details, Details, Details.

Was steht in deinem Skript? Was ist "dein Setup"?
Welche FK-Constraints sind auf deinen Tabellen definiert?

> Durch Auskommentieren habe ich den angeblich fehlerhaften Bereich

> mittlerweile ausfindig machen k�nnen und genau da wird es (f�r mich)
> mysteri�s, denn an der entsprechenden Stelle wird die Tabelle 'article'
> nicht angetastet.

Dann scheint diese Diagnose nicht zu stimmen.
Error 152 ist ganz klar FK-bezogen:

~ $perror 152
MySQL error code 152: Cannot delete a parent row

Und das "rename of '.\\mydb\\article' to '.\\mydb\\#sql2-ba8-5a'"
bezieht sich auf ein ALTER TABLE statement auf `mydb`.`article`
Intern ist ALTER TABLE n�mlich als "erzeuge eine Kopie der Tabelle
und benenne die anschlie�end um" implementiert.

Vermutlich gibt es einen FK mit article als Master-Tabelle.

> Sehe ich mir den 'Last Foreign Key Error' an, so steht zu Beginn:
> "Error in dropping of a foreign key constraint of table mydb/article"
>

> Und schlie�lich als Fehlermeldung:


> "Cannot find a constraint with the given id FK_cb_cs."

Das ist eindeutig. Es gibt kein Constraint mit dem angegebenen Namen
`FK_cb_cs`. Ins Blaue geraten: du f�hrst das gleiche Skript gegen
zwei verschiedene Datenbanken aus? Vielleicht hei�t das Constraint
ja tats�chlich jeweils anders? SHOW CREATE TABLE?

Und schlie�lich wird das Skript auch nur einmal fehlerfrei laufen.
Beim zweiten Mal ist der FK ja dann schon gel�scht...

> Doch wieso kommt es zu diesem falschen Bezug? Und wieso nur in meinem
> Setup und nicht auch im Query Browser?

Ich f�rchte ich kann dir nicht folgen. Der Query Browser macht auch
nichts anderes, als SQL-Statements aus dem "Skript" zu lesen und
auf den MySQL-Server abzuschie�en.


XL

Thorsten Kleibaum

unread,
Dec 22, 2009, 9:23:08 AM12/22/09
to
Hallo Axel,

danke f�r die Antwort. Ich habe im folgenden nur die Stellen aus dem
Skript zitiert, die ich f�r relevant halte. Mir ist klar, da� Du (oder
sonst wer) mir dadurch sicherlich nicht sagen kannst "mach das und das
und dann l�uft's", aber alle rund 270 Zeilen zu posten macht die Sache
sicherlich nicht �bersichtlicher.
Ich denke aber durch die zitierten Bereiche wird klar, warum ich das
Problem f�r "mysteri�s" halte und vielleicht kannst Du mir noch ein paar
Tips an die Hand geben, wie ich der Ursache selber auf die Spur kommen
kann. Grunds�tzlich sollte ich dazu fit genug sein.

Am 22.12.2009 10:15, schrieb Axel Schwenke:

>> Und zwar habe ich ein Skript geschrieben, das die DB-Struktur meiner
>> (.NET-)Anwendung von einer zur anderen Version anpa�t.
>>
>> F�hre ich deses Skript �ber den MySQL Query Browser aus, l�uft alles
>> wunderbar.
>>
>> F�hre ich dasselbe Skript �ber mein Setup aus, bekomme ich eine
>> Exception, die mir Fehler 1025 - "Error on rename of '.\\mydb\\article'
>> to '.\\mydb\\#sql2-ba8-5a' (errno: 152) - anzeigt.
>

> Was steht in deinem Skript?

[Diverse CREATEs...]

ALTER TABLE `mydb`.`article` CHANGE COLUMN `root_shortcut`
`root_shortcut` INT(11) NOT NULL DEFAULT '-1';

[...Diverse UPDATEs...]

# ERROR
ALTER TABLE `mydb`.`cb` DROP FOREIGN KEY `FK_cb_cs`;
ALTER TABLE `mydb`.`cb` DROP COLUMN `cs_id`;

[... weitere ALTERs & UPDATEs...]

So, wie Du siehst, wird in 'article' nur eine Spalten-Definition
ge�ndert. Ansonsten wird die Tabelle im gesamten Skript nicht angetastet.

Die fehlerhaften Zeilen habe ich mit ERROR markiert. Dort soll also
zun�chst in der Tabelle 'cb' der FK auf 'cs' gel�scht werden und
anschlie�end die Spalte, auf den er definiert war.
Kommentiere ich diese Zeilen aus, und lasse die Spalte und den FK in der
DB drin, obwohl ich ihn nicht mehr ben�tige, l�uft das Skript fehlerfrei
durch.


> Was ist "dein Setup"?

Ein msi-Paket halt, �ber das ich meine Anwendung installiere.


> Welche FK-Constraints sind auf deinen Tabellen definiert?

Also, 'article' hat jeweils 'nen FK auf den 'MwSt-Satz' und die
'Warengruppe'.
Auf 'article' wird aus einer Tabelle 'Positionen' verwiesen.
'cb' hat den zu l�schenden FK auf 'cs' und
'cs' hat jeweils 'nen FK auf eine Tabelle 'c' und 'cp'

Mehr FKs gibt es bei den betroffenen Tabellen nicht.


>> Durch Auskommentieren habe ich den angeblich fehlerhaften Bereich
>> mittlerweile ausfindig machen k�nnen und genau da wird es (f�r mich)
>> mysteri�s, denn an der entsprechenden Stelle wird die Tabelle 'article'
>> nicht angetastet.
>
> Dann scheint diese Diagnose nicht zu stimmen.
> Error 152 ist ganz klar FK-bezogen:
>
> ~ $perror 152
> MySQL error code 152: Cannot delete a parent row

Ich vermute auch, da� MySQL da was falsches rausspuckt - zumindest im
Bezug auf die Tabelle 'article'. Kommentiere ich das Statement mit
'article' aus, wird der rename-Fehler n�mlich bei einer anderen Tabelle
gemeldet.
Der Knackpunkt scheint aber in den oben angesprochenen ALTER-Statements
auf 'cb' zu liegen. Nur warum er aus dem Setup heraus den FK nicht
finden kann, bleibt mir ein R�tsel.


> Vermutlich gibt es einen FK mit article als Master-Tabelle.

Den gibt es aber nur in der Tabelle mit den 'Positionen'.


>> Sehe ich mir den 'Last Foreign Key Error' an, so steht zu Beginn:
>> "Error in dropping of a foreign key constraint of table mydb/article"
>>
>> Und schlie�lich als Fehlermeldung:
>> "Cannot find a constraint with the given id FK_cb_cs."
>
> Das ist eindeutig. Es gibt kein Constraint mit dem angegebenen Namen
> `FK_cb_cs`.

Gibt es aber doch. Und wie gesagt, mit dem Query Browser gibt es auch
keine Probleme.


> Ins Blaue geraten: du f�hrst das gleiche Skript gegen
> zwei verschiedene Datenbanken aus?

Habe ich auch schon dran gedacht, aber ich spreche die Datenbank
ausschlie�lich �ber [dbname].[tablename] an. Da sollte eigentlich nichts
schief gehen. Au�erdem sehe ich ja, da� die anderen �nderungen in der
richtigen DB landen, wenn ich oben erw�hnte Zeilen auskommentiere.


> Vielleicht hei�t das Constraint
> ja tats�chlich jeweils anders? SHOW CREATE TABLE?

Alles schon gepr�ft.


> Und schlie�lich wird das Skript auch nur einmal fehlerfrei laufen.
> Beim zweiten Mal ist der FK ja dann schon gel�scht...

Klar. Deshalb spiele ich vor der Ausf�hrung auch immer eine Sicherung
mit dem alten Stand zur�ck.


>> Doch wieso kommt es zu diesem falschen Bezug? Und wieso nur in meinem
>> Setup und nicht auch im Query Browser?
>
> Ich f�rchte ich kann dir nicht folgen. Der Query Browser macht auch
> nichts anderes, als SQL-Statements aus dem "Skript" zu lesen und
> auf den MySQL-Server abzuschie�en.

Sollte man meinen.

Gru�
Thorsten

Axel Schwenke

unread,
Dec 22, 2009, 11:34:53 AM12/22/09
to
Thorsten Kleibaum <t...@cityweb.de> wrote:
>
> danke f�r die Antwort. Ich habe im folgenden nur die Stellen aus dem
> Skript zitiert, die ich f�r relevant halte. Mir ist klar, da� Du (oder
> sonst wer) mir dadurch sicherlich nicht sagen kannst "mach das und das
> und dann l�uft's", aber alle rund 270 Zeilen zu posten macht die Sache
> sicherlich nicht �bersichtlicher.

Naja. Es gibt etliche Sites im Netz, wo man das Skript und das
komplette Schema (mysqldump -d) hinterlegen k�nnte.
Z.B. http://nopaste.info/

> Ich denke aber durch die zitierten Bereiche wird klar, warum ich das
> Problem f�r "mysteri�s" halte und vielleicht kannst Du mir noch ein paar
> Tips an die Hand geben, wie ich der Ursache selber auf die Spur kommen
> kann. Grunds�tzlich sollte ich dazu fit genug sein.

Prinzipiell w�rde man wohl den Kommandozeilenclient (mysql.exe)
nehmen und das Skript mit

mysql> source skriptfile

einlesen und ausf�hren lassen. Dann w�rde man unmittelbar zu jedem
Statement das Ergebnis sehen und k�nnte sich das Raten sparen.


XL

0 new messages