2011-10-05 16 views
12

MySQL 5.1.59 ném một lỗi lỗi với tạo bảng này:Có gì sai với Ngoại chính Hạn chế trong bảng này

CREATE TABLE IF NOT EXISTS `genre` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `abv` CHAR(3) CHARACTER SET 'latin1' COLLATE 'latin1_bin' NULL DEFAULT NULL , 
    `name` VARCHAR(80) NOT NULL DEFAULT '' , 
    `parent_id` INT NULL DEFAULT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_genre_genre1` (`parent_id` ASC) , 
    CONSTRAINT `fk_genre_genre1` 
    FOREIGN KEY (`parent_id`) 
    REFERENCES `genre` (`id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 

nào được tạo ra bởi MySQLWorkbench 5.2.33.

Các thông báo lỗi là:

ERROR 1005 (HY000) at line __: Can't create table 'mydb.genre' (errno: 150) 

Có gì sai với tạo bảng này?

The manual says:

Nếu MySQL báo cáo một số lỗi 1005 từ một câu lệnh CREATE TABLE, và thông báo lỗi liên quan đến lỗi 150, tạo bảng thất bại vì một ràng buộc khoá ngoại đã không được hình thành một cách chính xác.

Nó cũng nói rằng tài liệu tham khảo nước ngoài chìa khóa dẫn đến cùng một bảng được phép:

InnoDB hỗ trợ tài liệu tham khảo nước ngoài chủ chốt trong một bảng. Trong những trường hợp này, “bản ghi bảng con” thực sự đề cập đến các hồ sơ phụ thuộc trong số cùng một bảng.

Mối quan hệ tôi muốn là một phụ huynh không xác định để đại diện cho phân cấp thể loại và thể loại phụ. Một thể loại không cần phải có một phụ huynh, do đó parent_id là nullable.

Nó có thể có liên quan mà MySQLWorkbench thiết lập như sau:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 
+2

'SHOW ENGINE InnoDB STATUS' ngay sau khi nhận được lỗi đó. Nó sẽ cung cấp cho bạn thông báo lỗi thực sự, bình thường. – derobert

+1

+1 Đối với câu hỏi được thiết kế độc đáo với tất cả thông tin liên quan. – Johan

+0

Đó là mẹo hữu ích, derobert, cảm ơn! –

Trả lời

8

Cột của bạn idint unsigned; cột của bạn parent_idint. Những người không phù hợp. Giải pháp là thay đổi parent_id thành int unsigned.

Nếu bạn chạy SHOW ENGINE InnoDB STATUS tôi đặt trong một chú thích, bạn thấy điều này:

11005 17:18:38 Error in foreign key constraint of table test/genre: 

    FOREIGN KEY (`parent_id`) 
    REFERENCES `genre` (`id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE) 
ENGINE = InnoDB: 
Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 
Note that the internal storage type of ENUM and SET changed in 
tables created with >= InnoDB-4.1.12, and such columns in old tables 
cannot be referenced by such columns in new tables. 
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html 
for correct foreign key definition. 

Lưu ý các "loại cột trong bảng và bảng tham chiếu không phù hợp với" một phần.

+0

Vâng đó là một sửa chữa dễ dàng! Cảm ơn. –

+0

+1 cho đầu ra của chương trình. – Johan

+0

cảm ơn! đã cứu ngày của tôi – zeroliu

6

Hai lĩnh vực không phải là cùng loại.

CREATE TABLE IF NOT EXISTS `genre` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, <<-- unsigned int 
    .. 
    .. 
    `parent_id` INT NULL DEFAULT NULL ,  <<-- signed int 
    PRIMARY KEY (`id`) ,     ***** not the same!!!! 
    .... 
+0

Siêu! Cảm ơn! Tôi đã cho derobert dấu kiểm chỉ vì anh ta sớm hơn một phút. –

+0

@fsb, Không anh ấy không! -) tôi cách đây 16 phút, derobert 15 phút trước. Tuy nhiên derobert đã có một liên kết tuyệt vời để thingy động cơ hiển thị, do đó, chấp nhận của ông cũng kiếm được. – Johan

5

idUNSIGNED nhưng parent_id không phải là unsigned.

5

Các trường phải cùng loại. id không được ký trong khi parent_id không phải là

Các vấn đề liên quan