Tabelle wird nicht erstellt

Delbor

Benutzer
Beiträge
12
Hi zusammen

Ich bin eben hereingeschneit und möchte euch darum erstmal herzlich begrüssen - und auch gleich mit dem 'Ernst des Lebens' beginnen.

Ich habe eine Bilddatenbank erstellt, die als Datenspeicher für ein selbstentwickeltes Delphi-Programm dient. Die DB selbst habe ich mit MySQL-Workbench erstmal modelliert und per Forward engineering erzeugt. Das lief erstmal prächtig. Allerdings - da ich eigentlich hauptsächlich Delphi programmiere, findet die DB-Programierung eher am Rande statt.
Mein derzeitiges Problem ist: Ich habe das zugrundeliegende DB-Modell erweitert und wollte nun die DB durch Forward engineering erzeugen lassen. Im Anhang findet ihr ein Jpeg meines neuen Datenmodells.
Nachdem ich das Forward engineering durchgeführt habe, erhalte ich folgende Meldung:

Code:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'contentmasterdata.galerietabelle' (errno: 150)
SQL Code:
  CREATE TABLE IF NOT EXISTS `ContentMasterData`.`galerietabelle` (
  `Gallery_ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `GalleryName` VARCHAR(50) CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' NULL,
  PRIMARY KEY USING BTREE (`Gallery_ID`))
  ENGINE = InnoDB
  DEFAULT CHARACTER SET = latin1
  COLLATE = latin1_swedish_ci

SQL script execution finished: statements: 6 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

SQL script execution finished: statements: 6 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

Zum einen finde ich die Ursache, weswegen diese Tabelle nicht erstellt werden kann, nicht, zum andern irritiert mich, die Mengenangabe (6 succeeded, 1 failed). Workbench zeigt mir vor der Durchführung den auszuführenden code an, und danach müssten korrekt 12 Statements ausgefürt werden.

Der Code für die Zweite Tabelle:

Code:
DROP TABLE IF EXISTS `ContentMasterData`.`kategorien_tabelle` ;
CREATE TABLE IF NOT EXISTS `ContentMasterData`.`kategorien_tabelle` (
  `Kath_ID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `Kategorie` VARCHAR(120) CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' NOT NULL,
  PRIMARY KEY (`Kath_ID`))
ENGINE = InnoDB
AUTO_INCREMENT = 3
DEFAULT CHARACTER SET = latin1
COLLATE = latin1_swedish_ci;

Diese Tabelle enthält bereits Testdaten, weshalb Autoincrement den Wert 3 hat.

Gruss
Delbor
 

Anhänge

  • CM DataModell.JPG
    CM DataModell.JPG
    185 KB · Aufrufe: 4
Werbung:
Hi akretschmer

Danke für deine Antwort! Inzwischen hab ich mir das deutsche Referenzhandbuch als PDF von der MySQL-Seite geladen, und so ist die Frage, weshalb der FK nicht wohlgeformt ist.
Ich habe mal ein Drop Database ausgeführt und anschliessend nochmal ein Forward Engineering. Wieder erhelt ich eine Fehlermeldung, die jetzt aber anders lautete:
Code:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'contentmasterdata.kategorien_tabelle_has_bilddescribetabelle' (errno: 150)
SQL Code:
        CREATE TABLE IF NOT EXISTS `ContentMasterData`.`kategorien_tabelle_has_bildDescribeTabelle` (
          `kategorien_tabelle_Kath_ID` INT(10) UNSIGNED NOT NULL,
          `BildDescribeTabelle_BilddesribeID` INT UNSIGNED NOT NULL,
          `BildDescribeTabelle_Bildtabelle_idBild` INT UNSIGNED NOT NULL,
          PRIMARY KEY (`kategorien_tabelle_Kath_ID`, `BildDescribeTabelle_BilddesribeID`, `BildDescribeTabelle_Bildtabelle_idBild`),
          INDEX `fk_kategorien_tabelle_has_BildDescribeTabelle_BildDescribeT_idx` (`BildDescribeTabelle_BilddesribeID` ASC, `BildDescribeTabelle_Bildtabelle_idBild` ASC),
          INDEX `fk_kategorien_tabelle_has_BildDescribeTabelle_kategorien_ta_idx` (`kategorien_tabelle_Kath_ID` ASC),
          CONSTRAINT `fk_kategorien_tabelle_has_BildDescribeTabelle_kategorien_tabe1`
            FOREIGN KEY (`kategorien_tabelle_Kath_ID`)
            REFERENCES `ContentMasterData`.`kategorien_tabelle` (`Kath_ID`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION,
          CONSTRAINT `fk_kategorien_tabelle_has_BildDescribeTabelle_BildDescribeTab1`
            FOREIGN KEY (`BildDescribeTabelle_BilddesribeID` , `BildDescribeTabelle_Bildtabelle_idBild`)
            REFERENCES `ContentMasterData`.`bilddescribetabelle` (`BilddesribeID` , `bildtabelle_idbild`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB
        DEFAULT CHARACTER SET = utf8
        COLLATE = utf8_unicode_ci

SQL script execution finished: statements: 14 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

Offenbar müssen die Attribute übereinstimmen. Ich hab schon gedacht, ich hätte das hingekriegt; dem ist aber offenbar nicht so. Übrigens - oben angemeckerte Tabelle ist eine Zwischentabelle einer n:m-Bezirhung.
Im Anhang die für die Spalten eingestellten Werte.

Gruss
Delbor
 

Anhänge

  • bilddescribetabelle.JPG
    bilddescribetabelle.JPG
    28,6 KB · Aufrufe: 1
  • kategorien_tabelle_has_bildDescribeTabelle.JPG
    kategorien_tabelle_has_bildDescribeTabelle.JPG
    28,1 KB · Aufrufe: 1
  • kategorien_tabelle.JPG
    kategorien_tabelle.JPG
    18,2 KB · Aufrufe: 1
Hi akretschmer

Danke für deine Antwort! Inzwischen hab ich mir das deutsche Referenzhandbuch als PDF von der MySQL-Seite geladen, und so ist die Frage, weshalb der FK nicht wohlgeformt ist.

Vermutlich stimmen die Datentypen nicht überein. Ich halte ja viel von MySQL, insbesondere Abstand. Hab jetzt keinen Bock, mir die Bilder da anzuschauen, ich denke, Du schaffst das nun.
 
Hi akrtschmer


Vielen Dank für deine Antwort - da müsste ich wirklich noch nachsehen
Ist auch reproduzierbar:

Code:
mysql> create table master2 (id int primary key) engine=innodb;
Query OK, 0 rows affected (0.07 sec)

mysql> create table slave2 (id char(5), foreign key (id) references master(id)) engine=innodb;
ERROR 1005 (HY000): Can't create table 'db183175_2.slave2' (errno: 150)

:)
Als ich damit begonnen habe, dachte ich noch, ich müsse mich aus Kompatibitätsgründen für MySQL entscheiden...

Gruss
Delbor

Zu was, bitte, ist MySQL kompatibel? Das ist ja nicht einmal zu sich selbst kompatibel, sah die Tage eine kapotte Replikation, weil eine Seite hatte Version 5.X.y und die andere 5.X.y+1 -> Peng. (genaue Werte von X und y weiß ich jetzt nicht). Also wegen Kompatibilität nutzt man eher kein MySQL.
 
hi akretschmer

Zu was, bitte, ist MySQL kompatibel? Das ist ja nicht einmal zu sich selbst kompatibel, sah die Tage eine kapotte Replikation, weil eine Seite hatte Version 5.X.y und die andere 5.X.y+1 -> Peng.

Das vorliegende Projekt ist zwar eine Desktopanwendung, das Ziel jedoch eine Webserveranwendung, und für die wird von meinem Hoster entweder Access, M$SQL oder MySQL angeboten. 'Kompatibilität' muss also eher in diesem Zusammenhang gesehen werden.
M$SQL ist kostenflichtig und Accsess für einen durchschnittlichen Webeinsatz wohl eher untauglich; mich erstaunt schon, dass mein Hoster Access überhaupt unterstützt.

Eine Überprüfung der Datentypen der direkt beteiligten Tabellen hat keinen Fehler zutage gebracht - bis auf einen Eintrag 'int(10)'. Wie der zustandekam, ist mir rätselhaft.
Ausserdem: das vorliegende DB-Modell ist lediglich eine Erweiterung des ursprünglichen DB-Modells, dass ich unter einem andern Namen abgespeichert habe. Und wie ich schon erwähnt habe: das erste Modell funktionierte einwandfrei.

Einen Punkt habe ich gestern abend allerdings vergessen: oft muss der Server, um auf Veränderungen richtig zu reagieren, neu gestartet werden; nach der Nachtruhe ist er das jetzt.

Gruss
Delbor
 
wird von meinem Hoster entweder Access, M$SQL oder MySQL angeboten. 'Kompatibilität' muss also eher in diesem Zusammenhang gesehen werden.
M$SQL ist kostenflichtig und Accsess für einen durchschnittlichen Webeinsatz wohl eher untauglich; mich erstaunt schon, dass mein Hoster Access überhaupt unterstützt.

Ja, kenne ich, machen bei uns auch einige. Krampf, sag ich nur.
 
Hi zusammen

Soeben habe ich nochmal versucht, aus meinem Modell eine DB erstellen zu lassen - mit dem bekannnten erfolg:
Code:
ERROR: Error 1005: Can't create table 'contentmasterdata.kategorien_tabelle_has_bilddescribetabelle' (errno: 150)
SQL Code:
        CREATE TABLE IF NOT EXISTS `ContentMasterData`.`kategorien_tabelle_has_bildDescribeTabelle` (
          `kategorien_tabelle_Kath_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
          `BildDescribeTabelle_BilddesribeID` INT UNSIGNED NOT NULL,
          `BildDescribeTabelle_Bildtabelle_idBild` INT UNSIGNED NOT NULL,
          PRIMARY KEY (`kategorien_tabelle_Kath_ID`, `BildDescribeTabelle_BilddesribeID`, `BildDescribeTabelle_Bildtabelle_idBild`),
          INDEX `fk_kategorien_tabelle_has_BildDescribeTabelle_BildDescribeT_idx` (`BildDescribeTabelle_BilddesribeID` ASC, `BildDescribeTabelle_Bildtabelle_idBild` ASC),
          INDEX `fk_kategorien_tabelle_has_BildDescribeTabelle_kategorien_ta_idx` (`kategorien_tabelle_Kath_ID` ASC),
          CONSTRAINT `fk_kategorien_tabelle_has_BildDescribeTabelle_kategorien_tabe1`
            FOREIGN KEY (`kategorien_tabelle_Kath_ID`)
            REFERENCES `ContentMasterData`.`kategorien_tabelle` (`Kath_ID`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION,
          CONSTRAINT `fk_kategorien_tabelle_has_BildDescribeTabelle_BildDescribeTab1`
            FOREIGN KEY (`BildDescribeTabelle_BilddesribeID` , `BildDescribeTabelle_Bildtabelle_idBild`)
            REFERENCES `ContentMasterData`.`bilddescribetabelle` (`BilddesribeID` , `bildtabelle_idbild`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB
        DEFAULT CHARACTER SET = latin1
        COLLATE = latin1_swedish_ci

SQL script execution finished: statements: 14 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

Dabei ist mir folgendes aufgefallen:
INDEX `fk_kategorien_tabelle_has_BildDescribeTabelle_BildDescribeT_idx`
CONSTRAINT `fk_kategorien_tabelle_has_BildDescribeTabelle_kategorien_tabe1`
CONSTRAINT `fk_kategorien_tabelle_has_BildDescribeTabelle_BildDescribeTab1`
Man beachte hier die Enden der Strings, die sich auf Tabellennamen beziehen. Da die Dinger hier Index-, bzw. Constraintnamen sind, geh ich mal davon aus, dasss dies keinen Einfluss haben sollte - aber es ist beim besten Willen die einzige Abweichung, die ich entdecken konnte.

Was hab ich übersehen?

Gruss
Delbor
 
Man beachte hier die Enden der Strings, die sich auf Tabellennamen beziehen. Da die Dinger hier Index-, bzw. Constraintnamen sind, geh ich mal davon aus, dasss dies keinen Einfluss haben sollte - aber es ist beim besten Willen die einzige Abweichung, die ich entdecken konnte.

IIRC hat MySQL eine Begrenzung auf 64 oder so Zeichen bei Bezeichnern, vielleicht schlägt das zu.
 
Hi zusammen.

Ist der Name des Constraint evtl. einfach zu lang ?...

Irgendwie klammere ich mich doch genau daran - denn das ist offensichtlich. Nur - die Constraints haben ja Referenzwerte, und da sind die beteiligten Tabellennamen korrekt ausgeschrieben.
Würde MySQL zuerst nach ConstrainstNamen/IndexNamen suchen und dann deren Werte vergleichen, wäre die Sache klar - Constraints- und Indexnamen stimmen nicht überein. Aber mir scheint, die Namen sind hier eher nebensächlich.
Da hab ich etwas möglicherweise wesentliches vergessen, zu erwähnen:
Mein derzeitiges Problem ist: Ich habe das zugrundeliegende DB-Modell erweitert und wollte nun die DB durch Forward engineering erzeugen lassen.
Das ursprüngliche DB-Modell hatte nur 7 Tabellen. Ich habe mir die Sache einfach gemacht und es unter einem andern Namen(ContentMasterData) abgespeichert und das dann erweitert. Die aktuell als nicht erstellbar angemeckerte Tabelle hat ursprünglich die selben Constraints und Indizes, abgesehen von einigen kleinen Anpassungen. Dabei hatte ich Datentypangaben wie 'int(10)' in 'int' abgeändert. Die ursprünglichen Tabellen wurden jedoch alle anstandslos erstellt.

Eben hab ich mal machgesehen, ob ich, statt das Ursprungsmodell unter anderem Namen abzuspeichern, dieses hätte exportieren sollen. Aber da lassen sich verschiedene Bilder sowie die Create-Syntax exportieren, nicht das Modell als solches.

Kann es sein, dass das Modell, so wie es jetzt dasteht, Designfehler aufweist?

Im Anhang mal ein jpeg meines uursprünglichen Modells - wie man sieht, sind hier alle Beziehungen identifizierend..,

Gruss
Delbor
 

Anhänge

  • Delbor Workbench3.JPG
    Delbor Workbench3.JPG
    127,8 KB · Aufrufe: 2
Hi zusammen

Mein letzter Versuch:

Code:
Executing SQL script in server
ERROR: Error 1060: Duplicate column name 'bildtabelle_idBild'
SQL Code:
  CREATE TABLE IF NOT EXISTS `ContentMasterData`.`bilddescribetabelle` (
  `BilddesribeID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `bildkatID` INT UNSIGNED NOT NULL,
  `bildtabelle_idbild` INT UNSIGNED NOT NULL,
  `bildname` VARCHAR(45) CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' NULL,
  `Dateipfad` VARCHAR(250) CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' NULL,
  `bildbeschreibung` VARCHAR(800) CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' NULL,
  `bildlegende` VARCHAR(300) CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' NULL,
  `Author` VARCHAR(250) NULL,
  `bildtabelle_idBild` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`BilddesribeID`, `bildtabelle_idBild`),
  INDEX `fk_bilddescribetabelle_bildtabelle1_idx` (`bildtabelle_idBild` ASC),
  CONSTRAINT `fk_bilddescribetabelle_bildtabelle1`
  FOREIGN KEY (`bildtabelle_idBild`)
  REFERENCES `ContentMasterData`.`bildtabelle` (`idBild`)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION)
  ENGINE = InnoDB
  DEFAULT CHARACTER SET = latin1
  COLLATE = latin1_swedish_ci

SQL script execution finished: statements: 12 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

Tja, da hab ich doch auf den ersten Blick nur gerade mal den geänderten Tabellennamen gesehen und mich schon gefreut, ich müsse nur alle nichtidentifizierenden Beziehungen in identifizierende ändern. Aber Pustekuchen die Fehlermeldung in Workbench besagt, dass 12 Statements ausgführt wurden und eine nicht, Im DB-Ordner liegen aber gerade mal drei Tabellen...

Gruss
Delbor
 
Hi zusammen

Mein letzter Versuch:

Code:
Executing SQL script in server
ERROR: Error 1060: Duplicate column name 'bildtabelle_idBild'
SQL Code:
  CREATE TABLE IF NOT EXISTS `ContentMasterData`.`bilddescribetabelle` (
  `bildtabelle_idbild` INT UNSIGNED NOT NULL,
  `bildtabelle_idBild` INT UNSIGNED NOT NULL,

Ich hab mal Dein Create Table soweit gekürzt, das der Fehler (hoffentlich) Dir schneller ins Auge springt.
 
Werbung:
Hi akretschmer

Danke für deine Antwort und deine Bemühungen! Das hab ich beim zweiten Hinschauen auch entdeckt und bereits korrigiert.
Nach einem weiteren Versuch weigert sich der Server jetzt, die Zwischentabelle zur GalerieTabelle zu erstellen.
Ich habe mir das gerade angesehen, habe aber den Fehler noch nicht entdecken können. Deshalb hier nochmal der Code:
Code:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'contentmasterdata.galerietabelle_has_bilddescribetabelle' (errno: 150)
SQL Code:
        CREATE TABLE IF NOT EXISTS `ContentMasterData`.`galerietabelle_has_bilddescribetabelle` (
          `bilddescribetabelle_BilddesribeID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
          `bilddescribetabelle_bildtabelle_idbild` INT UNSIGNED NOT NULL,
          `HtmlTabelle_idHtml` INT UNSIGNED NOT NULL,
          PRIMARY KEY (`bilddescribetabelle_BilddesribeID`, `bilddescribetabelle_bildtabelle_idbild`, `HtmlTabelle_idHtml`),
          INDEX `fk_galerietabelle_has_bilddescribetabelle_bilddescribetabel_idx` (`bilddescribetabelle_BilddesribeID` ASC, `bilddescribetabelle_bildtabelle_idbild` ASC),
          INDEX `fk_galerietabelle_has_bilddescribetabelle_HtmlTabelle1_idx` (`HtmlTabelle_idHtml` ASC),
          CONSTRAINT `fk_galerietabelle_has_bilddescribetabelle_bilddescribetabelle1`
            FOREIGN KEY (`bilddescribetabelle_BilddesribeID`)
            REFERENCES `ContentMasterData`.`bilddescribetabelle` (`BilddesribeID`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION,
          CONSTRAINT `fk_galerietabelle_has_bilddescribetabelle_HtmlTabelle1`
            FOREIGN KEY (`HtmlTabelle_idHtml`)
            REFERENCES `ContentMasterData`.`HtmlTabelle` (`idHtml`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB
        DEFAULT CHARACTER SET = utf8
        COLLATE = utf8_unicode_ci

SQL script execution finished: statements: 18 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

Erst habe ich gedacht, ich würdde den Fehler selbst entdecken, aber damit war bisher nichts.

Gruss
Delbor
 
Zurück
Oben