2013-01-12 8 views
5

Mam następujące tabele:SQL: ERROR 1005: Nie można utworzyć tabeli '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`)); 

Teraz ponieważ połączenie jest wiele do wielu, każdy element może mieć wiele temat i każdy temat może być powiązany z wieloma przedmiotami - chciałbym ustawić tabelę połączeń. To jest mój kod:

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

ale z jakiegoś powodu kod 3rd tabeli nie są akceptowane. otrzymuję komunikat o błędzie:

ERROR 1005: nie można utworzyć tabeli 'obl2.itemsubjects' (errno: 121)

Czytałem o błędzie w internecie i mówi jest to znane wydanie MYSQL, ale nie ma rozwiązań.

Jakieś myśli?

+0

możesz spróbować wstawić jakieś dane do dwóch pierwszych tabeli w skrypcie, a następnie dodać utworzyć tabelę trzeciej tabeli? – bonCodigo

+0

hej bonCondigo, próbowałem tego teraz .. wciąż ten sam błąd. Muszę powiedzieć, że zrobiłem to samo wcześniej z autorami i wszystko działało idealnie. Mogę zrozumieć, dlaczego z przedmiotami się nie udaje. –

+0

Czy należy podać jawne nazwy tabel za pomocą db? – bonCodigo

Odpowiedz

3

Docs MySQL powiedzieć w FOREIGN KEY Constraints (kopalnia nacisk):

Jeśli klauzula CONSTRAINT symbol jest podany, symbol wartość musi być unikalna w bazie. Jeśli klauzula nie zostanie podana, InnoDB automatycznie utworzy nazwę.

więc powodem, że stworzenie itemsubject stół zawiodła, było to, że miał inny (klucz obcy) ograniczenie, o nazwie itemID lub jedną o nazwie subjectID w innej tabeli bazy danych.

Dobrze mieć konsensus nazewnictwa, który jest standardowy w całej bazie danych. Tak jak masz ColumnName_idx dla indeksów, można użyć ReferencedTable_ReferencingTable_FK dla zagranicznych kluczowych ograniczeń:

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 
); 
Powiązane problemy