2013-01-12 5 views
5

habe ich die folgenden Tabellen:SQL: ERROR 1005: Can not create table 'obl2.itemsubjects' (errno: 121)

CREATE TABLE `OBL2`.`item` (
`itemID` INT NOT NULL AUTO_INCREMENT , 
`itemName` VARCHAR(45) NOT NULL , 
PRIMARY KEY (`itemID`) , 
INDEX `itemName` (`itemName` ASC)); 

CREATE TABLE `OBL2`.`subject` (
`subjectID` INT NOT NULL , 
`subjectName` VARCHAR(45) NOT NULL , 
PRIMARY KEY (`subjectID`)); 

Nun, da die Verbindung zu vielen, vielen ist, kann jedes Element viele haben Thema und jedes Thema kann mit vielen Gegenständen in Verbindung gebracht werden - ich möchte eine Verbindungstabelle einstellen. Dies ist mein Code:

CREATE TABLE `OBL2`.`itemsubjects` (
`itemID` INT NOT NULL , 
`subjectID` INT NOT NULL , 
PRIMARY KEY (`itemID`, `subjectID`) , 
INDEX `itemID_idx` (`itemID` ASC) , 
INDEX `subjectID_idx` (`subjectID` ASC) , 
CONSTRAINT `itemID` 
FOREIGN KEY (`itemID`) 
REFERENCES `OBL2`.`item` (`itemID`) 
ON DELETE CASCADE 
ON UPDATE CASCADE, 
CONSTRAINT `subjectID` 
FOREIGN KEY (`subjectID`) 
REFERENCES `OBL2`.`subject` (`subjectID`) 
ON DELETE CASCADE 
ON UPDATE CASCADE); 

aber aus irgendeinem Grund der Code der dritten Tabelle wird nicht akzeptiert wird. Ich erhalte eine Fehlermeldung:

ERROR 1005: Can not create table 'obl2.itemsubjects' (errno: 121)

ich über den Fehler im Internet gelesen habe, und es sagt Es ist ein bekanntes Problem von MYSQL, aber es gibt keine Lösungen.

Irgendwelche Gedanken?

+0

Können Sie versuchen, einige Daten zu beiden ersten Tabelle im Skript einfügen und erstellen Tabelle für dritte Tabelle hinzufügen? – bonCodigo

+0

hey bonCondigo, das habe ich jetzt probiert .. immer noch gleicher fehler. Ich muss sagen, dass ich das gleiche früher mit Autoren gemacht habe und es hat perfekt funktioniert. Ich kann verstehen, warum es mit Themen fehlschlägt. –

+0

Müssen Sie explizite Tabellennamen mit db angeben? – bonCodigo

Antwort

3

Die MySQL docs sagen in FOREIGN KEY Constraints (Hervorhebung von mir):

Wenn die CONSTRAINT Symbol-Klausel angegeben ist, das Symbol Wert in der Datenbank eindeutig sein muss. Wenn die Klausel nicht angegeben wird, erstellt InnoDB den Namen automatisch.

Also, der Grund, dass die itemsubject Tabelle konnte nicht erstellt werden, war, dass Sie einen anderen (über Fremdschlüssel) hatte, mit dem Namen itemID oder ein subjectID in einer anderen Tabelle der Datenbank mit dem Namen.

Es ist gut, eine Namenskonvention zu haben, die in der Datenbank standardmäßig verwendet wird. So wie Sie ColumnName_idx für Indizes haben, können Sie ReferencedTable_ReferencingTable_FK für Fremdschlüssel-Constraints verwenden:

CREATE TABLE OBL2.itemsubjects (
    itemID INT NOT NULL , 
    subjectID INT NOT NULL , 
    PRIMARY KEY 
    (itemID, subjectID) , 
    INDEX itemID_idx       -- I like these 
    (itemID ASC) , 
    INDEX subjectID_idx      -- two 
    (subjectID ASC) , 
    CONSTRAINT item_itemsubject_FK    -- what I propose, here 
    FOREIGN KEY (itemID) 
    REFERENCES OBL2.item (itemID) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
    CONSTRAINT subject_itemsubject_FK   -- and here 
    FOREIGN KEY (subjectID) 
    REFERENCES OBL2.subject (subjectID) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
);