SQL: Fremdschlüssel können nicht angelegt werden

mkreft

Benutzer
Beiträge
8
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
 
Werbung:

mkreft

Benutzer
Beiträge
8
Ja, setze die auf INT, ohne autoincrement, das ist sinnfrei an dieser Stelle.


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...
 

akretschmer

Datenbank-Guru
Beiträge
9.520
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...


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

Benutzer
Beiträge
8
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! :)
 

akretschmer

Datenbank-Guru
Beiträge
9.520
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! :)

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.
 

mkreft

Benutzer
Beiträge
8
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>
 

mkreft

Benutzer
Beiträge
8
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>
 
Werbung:
Oben