2013-01-12 17 views
5

ho le seguenti tabelle:SQL: ERRORE 1005: Impossibile creare la tabella '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`)); 

Ora, poiché la connessione è molti a molti, ogni elemento può avere molti soggetto e ogni soggetto può essere correlato a molti elementi - Mi piacerebbe impostare una tabella di connessione. Questo è il mio codice:

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); 

ma per qualche ragione non viene accettato il codice del 3 ° tavolo. ricevo un messaggio di errore:

ERRORE 1005: Impossibile creare la tabella 'obl2.itemsubjects' (errno: 121)

Ho letto sull'errore su internet e si dice è un problema noto di MYSQL ma non ci sono soluzioni.

Qualche idea?

+0

Puoi provare a inserire alcuni dati per i primi due tabella nello script e quindi aggiungere creare la tabella per il terzo tavolo? – bonCodigo

+0

hey bonCondigo, ci ho provato ora .. ancora lo stesso errore. Devo dire che ho fatto la stessa cosa in precedenza con gli autori e ha funzionato perfettamente. posso capire perché con soggetti fallisce. –

+0

È necessario per te fornire nomi tabella espliciti con db? – bonCodigo

risposta

3

La documentazione di MySQL dice in FOREIGN KEY Constraints (sottolineatura mia):

Se viene data la clausola CONSTRAINT simbolo, il valore disimbolo deve essere univoco nel database. Se la clausola non viene fornita, InnoDB crea automaticamente il nome.

Quindi, la ragione che la creazione itemsubject tavolo fallito, era che si doveva un altro vincolo (chiave esterna), di nome itemID, o uno di nome subjectID in qualche altra tabella del database.

È utile avere una convenzione di denominazione standard nel database. Proprio come avete ColumnName_idx per gli indici, è possibile utilizzare ReferencedTable_ReferencingTable_FK per vincoli di chiave esterna:

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 
); 
Problemi correlati