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

SQL: Fremdschlüssel können nicht angelegt werden

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von mkreft, 20 August 2013.

  1. mkreft

    mkreft Benutzer

    Hallo Zusammen,

    ich erstelle aktuell eine Datenbank zur Verwaltung von 3D-Modellen
    unterschiedlichster Art. Da ich schon ein wenig aus bin aus SQL,
    kämpfe ich gerade mit den Fremdschlüsseln in einer Zwischentabelle.

    Das bisherige Script, die letzte Tabelle darin ist die, welche sich Fehlerhaft verhält.

    Code:
    CREATE DATABASE IF NOT EXISTS 3Ddb;
     
    USE 3Ddb;
     
    CREATE TABLE Objekt(
        ID_O INT NOT NULL AUTO_INCREMENT,
        Objekttitel VARCHAR(50),
        Objektnotiz VARCHAR(300),
        PRIMARY KEY(ID_O))
        ENGINE =InnoDB;
     
    CREATE TABLE Tag(
        ID_T INT NOT NULL AUTO_INCREMENT,
        Tagname VARCHAR(50),
        PRIMARY KEY(ID_T))
        ENGINE =InnoDB;
     
    CREATE TABLE Tag_Objekt(
        ID_Tag_Obj INT NOT NULL AUTO_INCREMENT,
        ID_O INT NOT NULL AUTO_INCREMENT,
        ID_T INT NOT NULL AUTO_INCREMENT,
        FOREIGN KEY(ID_O) REFERENCES Objekt (Objekt),
        FOREIGN KEY(ID_T) REFERENCES Tag (Tag),
        PRIMARY KEY(ID_Tag_Obj))
        ENGINE =InnoDB;
    SQL haut mir dabei folgenden Fehler heraus:
    Code:
    mysql> CREATE TABLE Tag_Objekt(
        -> ID_Tag_Obj INT NOT NULL AUTO_INCREMENT,
        -> ID_O INT NOT NULL AUTO_INCREMENT,
        -> ID_T INT NOT NULL AUTO_INCREMENT,
        -> FOREIGN KEY(ID_O) REFERENCES Objekt (Objekt),
        -> FOREIGN KEY(ID_T) REFERENCES Tag (Tag),
        -> PRIMARY KEY(ID_Tag_Obj))
        -> ENGINE =InnoDB;
    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
    mysql> 
    Jemand Ideen?

    Gruß,
    Marc
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ja, setze die auf INT, ohne autoincrement, das ist sinnfrei an dieser Stelle.
     
  3. mkreft

    mkreft Benutzer


    Netter Versuch, ebenfalls erfolglos :/

    Code:
    mysql> CREATE TABLE Tag_Objekt(
        -> ID_Tag_Obj INT NOT NULL AUTO_INCREMENT,
        -> ID_O INT NOT NULL,
        -> ID_T INT NOT NULL,
        -> FOREIGN KEY(ID_O) REFERENCES Objekt (Objekt),
        -> FOREIGN KEY(ID_T) REFERENCES Tag (Tag),
        -> PRIMARY KEY(ID_Tag_Obj))
        -> ENGINE =InnoDB;
    ERROR 1005 (HY000): Can't create table '3Ddb.Tag_Objekt' (errno: 150)
    mysql> 
    Hm...
     
  4. akretschmer

    akretschmer Datenbank-Guru


    Du versuchst auf Spalte Objekt und Tag zu referenzieren, die gibt es nicht, die heißen anders.. Außerdem ist die eine Klammer hinter ID_Tag_Obj falsch.

    MySQL sucks. PostgreSQL zeigt die Fehler viel klarer an ;-)
     
    mkreft gefällt das.
  5. mkreft

    mkreft Benutzer

    Jo, danke, jetzt hab ich die Syntax beim Fremdschlüssel auch endlich mal geschnackelt...

    Code:
    CREATE TABLE Tag_Objekt(
        ID_Tag_Obj INT NOT NULL AUTO_INCREMENT,
        ID_O INT NOT NULL,
        ID_T INT NOT NULL,
        FOREIGN KEY(ID_O) REFERENCES Objekt (ID_O),
        FOREIGN KEY(ID_T) REFERENCES Tag (ID_T),
        PRIMARY KEY(ID_Tag_Obj))
        ENGINE =InnoDB;
    Damit hats funktioniert...

    Gruß an Dich! :)
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Bitte.

    Das mit der Klammer, was ich schrieb, war quatsch. Ähm, vermutlich sollten nicht mehrfache Kombinationen von Objekt und Tag vorkommen, man könnte den PK eigentlich über diese Spalten legen und auf den jetzigen PK verzichten.
     
  7. mkreft

    mkreft Benutzer

    Wie meinst Du das?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    so:
    Code:
    test=*# create table tag_objekt(id_t int references tag, id_o int references objekt, primary key(id_t, id_o));
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "tag_objekt_pkey" for table "tag_objekt"
    CREATE TABLE
    
     
  9. mkreft

    mkreft Benutzer

    Okay...
    Jedoch macht ein zweiter Fremdschlüssel auch zicken, vielleicht hast Du hier eine Vorstellung, woran das liegen kann?

    Leider sind diese zwei m:n-Beziehungen Notwendig.
    Ich hänge gerne auch das ERM mit an, falls gewünscht.

    Code:
    CREATE TABLE Scene(
        ID_SC INT NOT NULL AUTO_INCREMENT,
        Scenefile VARCHAR(50),
        Scenenotiz VARCHAR(300),
        ID_O INT NOT NULL,
        ID_R INT NOT NULL,
        FOREIGN KEY(ID_O) REFERENCES Objekt (ID_O),
        FOREIGN KEY(ID_R) REFERENCES Renderer (ID_R),
        PRIMARY KEY(ID_SC))
        ENGINE =InnoDB;
     
    CREATE TABLE Vorschaubilder(
        ID_VB INT NOT NULL AUTO_INCREMENT,
        Vorschaubild VARCHAR(50),
        ID_SC INT NOT NULL,
        FOREIGN KEY(ID_SC) REFERENCES Scene (ID_SC),
        PRIMARY KEY(ID_VB))
        ENGINE =InnoDB;
     
    CREATE TABLE Sourceimages(
        ID_Srci INT NOT NULL AUTO_INCREMENT,
        Srcifile VARCHAR(50),
        Filesize INT,
        PRIMARY KEY(ID_Srci))
        ENGINE =InnoDB;
     
    CREATE TABLE Scene_Sourceimage(
        ID_SC_Srci INT NOT NULL AUTO_INCREMENT,
        ID_SC INT NOT NULL,
        ID_Srci INT NOT NULL,
        FOREIGN KEY(ID_SC) REFERENCES Scene (ID_SC),
        FOREIGN KEY(ID_Srci) REFERENCES Sourceimage (ID_Srci),
        PRIMARY KEY(ID_SC_Srci))
        ENGINE =InnoDB;
    Achja, der Fehler wäre auch Interessant, was?...:
    Leider hat http://www.twiedmann.de/sqlbackstube/mysql_hy000_error_150
    auch nicht wirklich weitergeholfen dabei.
    Vielleicht fällt einem das Missgeschick ja auf, beim Prüfen?...

    Code:
    mysql> CREATE TABLE Scene_Sourceimage(
        -> ID_SC_Srci INT NOT NULL AUTO_INCREMENT,
        -> ID_SC INT NOT NULL,
        -> ID_Srci INT NOT NULL,
        -> FOREIGN KEY(ID_SC) REFERENCES Scene (ID_SC),
        -> FOREIGN KEY(ID_Srci) REFERENCES Sourceimage (ID_Srci),
        -> PRIMARY KEY(ID_SC_Srci))
        -> ENGINE =InnoDB;
    ERROR 1005 (HY000): Can't create table '3Ddb.Scene_Sourceimage' (errno: 150)
    mysql> 
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Sourceimage != Sourceimages

    Andreas
     
    mkreft gefällt das.
  11. mkreft

    mkreft Benutzer

    Wenn man den Wald vor lauter Bäumen nicht mehr sieht...
    Alles klar.....

    Danke Dir, Andreas ;)

    Code:
    mysql> CREATE TABLE Scene_Sourceimage(
        -> ID_SC_Srci INT NOT NULL AUTO_INCREMENT,
        -> ID_SC INT NOT NULL,
        -> ID_Srci INT NOT NULL,
        -> FOREIGN KEY(ID_SC) REFERENCES Scene (ID_SC),
        -> FOREIGN KEY(ID_Srci) REFERENCES Sourceimages (ID_Srci),
        -> PRIMARY KEY(ID_SC_Srci))
        -> ENGINE =InnoDB;
    Query OK, 0 rows affected (0.15 sec)
     
    mysql> 
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Na, dafür könntest ja auch mal 'Gefällt mir' drücken ;-)
     
  13. mkreft

    mkreft Benutzer

    ach, den gibts ja wirklich hier :)
     
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