2013-08-22 84 views
9

Tôi đang cố gắng tạo một bảng có cột VARCHAR làm khóa ngoài nhưng MySql cho tôi một lỗi khi tạo bảng. truy vấn của tôi là như thế này:Bảng MySQL với cột VARCHAR là khóa ngoài

CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, 
    category VARCHAR(80) NOT NULL, 
    PRIMARY KEY(id), 
    KEY `key_1` (`id`,`category`) 
) 
ENGINE=InnoDB; 


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    category VARCHAR(80) NOT NULL, 
    director_id TINYINT(3) UNSIGNED NULL, 
    director_name VARCHAR(100) NULL, 
    description VARCHAR(1000) NULL, 
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    user_id SMALLINT UNSIGNED NULL, 
    PRIMARY KEY(id), 
    KEY `networks_fk1` (`category`), 
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION, 
    INDEX networks_index2471(name), 
    INDEX networks_index2472(director_id, director_name) 
) 
ENGINE=InnoDB; 

và tôi nhận được lỗi này:

[Err] 1215 - Cannot add foreign key constraint 

Tôi đang sử dụng MySQL 5.6.12. Làm thế nào tôi có thể viết lại truy vấn của mình để sửa nó?

Trả lời

16

Bạn chỉ có thể có khóa ngoài tham chiếu một trường duy nhất. Sửa bảng network_classes của bạn để các lĩnh vực loại là độc đáo, như dưới đây

CREATE TABLE network_classes (
    id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT, 
    category VARCHAR(80) NOT NULL, 
    PRIMARY KEY(id), 
    UNIQUE KEY `category_UNIQUE` (`category`), 
    KEY `key_1` (`id`,`category`) 
) 
ENGINE=InnoDB; 


CREATE TABLE networks (
    id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(100) NOT NULL, 
    category VARCHAR(80) NOT NULL, 
    director_id TINYINT(3) UNSIGNED NULL, 
    director_name VARCHAR(100) NULL, 
    description VARCHAR(1000) NULL, 
    last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    user_id SMALLINT UNSIGNED NULL, 
    PRIMARY KEY(id), 
    KEY `networks_fk1` (`category`), 
    CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION, 
    INDEX networks_index2471(name), 
    INDEX networks_index2472(director_id, director_name) 
) 
ENGINE=InnoDB; 

Sau đó, bạn sẽ có thể thêm khóa ngoại bạn muốn

0

trong

CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) 
REFERENCES `network_classess` (`category`) ON DELETE NO ACTION, 

bạn đã sử dụng network_classess thay vì network_classes (như trong kịch bản của bạn tạo bảng), vì vậy bảng mà không tồn tại.

EDIT

Tên của chế của bạn là như nhau của những người chủ chốt (networks_fk1) thay đổi.

Tôi đọc DDL của bạn tốt hơn.

Bảng mạng của bạn có một khóa chính ID, vì vậy, hãy đặt chính xác trường khóa ngoài để liên kết trường id của bạn, trường danh mục không được xuất hiện trong mạng bảng của bạn, nhưng tôi nghĩ bạn phải đặt fk_network_class (như int) được liên kết với id (của network_classes)

+0

tôi sửa chữa nó nhưng vẫn có cùng một vấn đề –

+0

network_classess của bạn đang trống ? Một điều nữa, nếu bạn định nghĩa một khóa chính hỗn hợp, khóa ngoại phải bằng nhau (nó không ảnh hưởng đến lỗi của bạn) –

+0

vâng, đúng vậy. bạn có thể chạy truy vấn bên cạnh bạn không? Tôi đang tìm một giải pháp thực tế hơn là trí tưởng tượng lý thuyết. –

5

column types in the table and the referenced table do not match for constraint

Tại sao 2 cột vectơ có cùng kích thước không khớp với loại? Và tất nhiên câu trả lời là sự đối chiếu rõ ràng. Hóa ra rằng trong bảng mới, cột này là UTF-8 thay vì ASCII như trong bảng được tham chiếu. Thay đổi thành ascii và hoàn thành.

+0

Cả hai đều sử dụng cùng một loại (loại mặc định). Làm thế nào để bạn nói rằng !! ?? –

+0

cũng đáng nhắc đến, hãy chắc chắn rằng cả hai bảng InnoDB đều là –

1

Mục tiêu của ràng buộc FOREIGN KEY cần phải được lập chỉ mục. Thông thường, nó là một PRIMARY KEY vì vậy đây không phải là một vấn đề, nhưng trong trường hợp của bạn nó không phải (mặc dù nó là một phần của khóa tổng hợp, đó là không đủ)

Tạo chỉ mục trên network_classes. category trường:

CREATE INDEX category_idx ON network_classes(category); 

Sau đó, tạo lại bảng networks.

+0

Cảm ơn bạn rất nhiều Jeremy. Tôi đã tạo chỉ mục và nó đã được giải quyết. –

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