2013-01-12 33 views
5

Tôi có bảng sau:SQL: ERROR 1005: Không thể tạo bảng '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`)); 

Bây giờ kể từ khi kết nối được nhiều nhiều, mỗi mục có thể có nhiều chủ đề và mỗi chủ đề có thể liên quan đến nhiều mục - Tôi muốn đặt một bảng kết nối. Đây là mã của tôi:

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

nhưng vì lý do nào đó mã của bảng thứ ba không được chấp nhận. tôi nhận được một thông báo lỗi:

ERROR 1005: Không thể tạo bảng 'obl2.itemsubjects' (errno: 121)

Tôi đã đọc về lỗi trên internet và nó nói đó là một vấn đề đã biết của MYSQL nhưng không có giải pháp nào.

Mọi suy nghĩ?

+0

Bạn có thể thử để chèn một số dữ liệu để hai bảng đầu tiên trong kịch bản và sau đó thêm tạo bảng cho bảng thứ ba? – bonCodigo

+0

hey bonCondigo, tôi đã thử ngay bây giờ .. vẫn còn lỗi tương tự. Tôi phải nói rằng tôi đã làm điều tương tự trước đó với các tác giả và nó hoạt động hoàn hảo. tôi có thể hiểu tại sao với các đối tượng thất bại. –

+0

Bạn có phải cho biết tên bảng rõ ràng với db không? – bonCodigo

Trả lời

3

Các tài liệu MySQL nói trong FOREIGN KEY Constraints (tôi nhấn mạnh):

Nếu mệnh đề CONSTRAINT biểu tượng được đưa ra, các biểu tượng giá trị phải duy nhất trong cơ sở dữ liệu. Nếu điều khoản không được đưa ra, InnoDB sẽ tự động tạo tên.

Vì vậy, lý do mà việc tạo ra itemsubject bảng thất bại, là bạn đã có một (khoá ngoại) hạn chế, tên itemID, hoặc một tên subjectID trong một số bảng khác của cơ sở dữ liệu.

Thật tốt khi có một cấu hình đặt tên tiêu chuẩn trên cơ sở dữ liệu. Cũng như bạn có ColumnName_idx cho chỉ số, bạn có thể sử dụng ReferencedTable_ReferencingTable_FK cho ràng buộc khoá ngoại:

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 
); 
Các vấn đề liên quan