2013-02-22 37 views
18

MySQL Workbench đã đưa ra các lệnh SQL sau để tạo ra một bảng:MySQL lỗi 1022 khi tạo bảng

CREATE TABLE IF NOT EXISTS `mydb`.`errors_reports` (
    `error_id` INT NOT NULL , 
    `report_short` VARCHAR(15) NOT NULL , 
PRIMARY KEY (`error_id`, `report_short`) , 
INDEX `error_id_idx` (`error_id` ASC) , 
INDEX `report_short_idx` (`report_short` ASC) , 
CONSTRAINT `error_id` 
    FOREIGN KEY (`error_id`) 
    REFERENCES `mydb`.`errors` (`error_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
CONSTRAINT `report_short` 
    FOREIGN KEY (`report_short`) 
    REFERENCES `mydb`.`reports` (`report_short`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 

mà có vẻ tốt đẹp đối với tôi, và có một loạt các bảng rất tương tự khác trong cơ sở dữ liệu của tôi mà MySQL hoàn toàn hạnh phúc để tạo ra.

Nhưng một này ...

ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports' 

tôi không thể cho cuộc đời của tôi nhìn thấy bất kỳ phím trùng lặp ở đây. Chỉ có một khóa được xác định!

Tôi đang chạy MySQL 5.6 với cài đặt mặc định mới. Không có gì trong nhật ký lỗi.

Ý tưởng?

Edit: thông qua một quá trình loại trừ (trở lại định nghĩa đơn giản nhất của bảng, sau đó dần dần thêm bit trở lại trong) vấn đề dường như là bit này:

CONSTRAINT `error_id` 
    FOREIGN KEY (`error_id`) 
    REFERENCES `mydb`.`errors` (`error_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 

trong đó đặc biệt kỳ lạ như có mã giống hệt nhau trong một số định nghĩa bảng khác và chúng hoàn toàn ổn!

+0

tôi không có bất kỳ vấn đề với truy vấn này .. có vẻ như có thể có cái gì khác xảy ra –

+0

Không chắc chắn rằng bạn phải tạo một chỉ mục rõ ràng cho các cột FK. Tôi đã ấn tượng rằng việc tạo tham chiếu sẽ tạo ra một chỉ mục. – Kermit

+0

Kéo ra các câu lệnh INDEX không tạo ra sự khác biệt. –

Trả lời

-1

Hãy thử sử dụng INSERT IGNORE thay vì INSERT nơi INSERT IGNORE sẽ không chèn hàng mới nếu tìm thấy khóa chính trùng lặp. Điều này sẽ giúp giải quyết vấn đề tạm thời nhưng tôi khuyên bạn nên cắt bớt bảng.

+0

Đây là cách tạo bảng, không chèn dữ liệu. Không có INSERT nào xảy ra ở đây. –

+0

Phải.Nó chắc chắn là vấn đề quan trọng nước ngoài (lỗi 105 cho tôi). Đảm bảo rằng khóa ngoài và cột được tham chiếu có cùng các kiểu dữ liệu như đối chiếu, thuộc tính mặc định, v.v. –

2

Dường như bạn đang tạo chỉ mục trên các cột khóa ngoài. Khi tạo khóa ngoài trong InnoDb, một khóa sẽ được tạo tự động.

See this thread.

+0

Mã được sản xuất bởi MySQL Workbench, mà dường như thêm một cách rõ ràng. Không phải là nó tạo nên sự khác biệt. –

+0

@MattMcLeod Bạn có thể tạo các ràng buộc sau khi bảng được tạo không? Bạn cũng có thể thử [kiểm tra các chỉ mục] (http://stackoverflow.com/a/5213364/679449) trước/sau khi bảng được tạo ra không? – Kermit

+1

Aha! Điều này dẫn tôi đến những gì tôi tin là giải pháp: một bảng khác đã có cùng ràng buộc áp dụng lại: error_id, và Workbench cho cả hai cùng một tên ràng buộc như nhau. Thay đổi tên ràng buộc cho phép nó được tạo ra. –

59

Vấn đề là các tên của một nước ngoài chủ chốt không thể cùng như khác chính nước ngoài trong toàn bộ mô hình.

Hãy tưởng tượng tình huống này

Catalogue -> Nhà cung cấp

sản phẩm -> Nhà cung cấp

nếu tên của khóa ngoại trong bảng Catalog cho nhà cung cấp là "nhà cung cấp" và bạn đã gán cùng tên trong bảng sản phẩm thì các tên khóa ngoài sẽ "va chạm".

Bạn cần tên họ khác nhau ..

Ví dụ:

catalog_supplier product_supplier

+0

Cảm ơn! Đã có cùng một vấn đề và không thể hiểu được rằng khi có lỗi massage. BTW tên của khóa ngoại vi va chạm là không giống như tên cột, chỉ là một tên MySql nội bộ cho khóa. – uzilan

+2

đây là câu trả lời! tuyệt quá! –

+1

Bạn có biết tại sao hạn chế đó tồn tại trong MySQL không? – vipw

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