2011-11-18 15 views
12

Tôi đã thử thêm một khóa ngoại như thế này ...MySQL 5,5 thêm khóa ngoại thất bại với lỗi [HY000] [150] và [HY000] [1005]

ALTER TABLE OrderLineItem 
ADD CONSTRAINT 
     FK_OrderLineItem_ShippingType_name FOREIGN KEY 
(shippingType) 
REFERENCES ShippingType(name); 

Hoặc như thế này trong Mysql 5.5. ..

alter table OrderLineItem add foreign key 
FK_OrderLineItem_ShippingType (shippingType) references ShippingType(name); 

Mỗi lần tôi thấy lỗi sau.

[2011-11-18 15:07:04] [HY000] [150] Tạo bảng 'realtorprint_dev_dev/# sql-7d0_80' với ràng buộc khóa ngoài không thành công. Không có chỉ mục trong bảng được tham chiếu, trong đó các cột được tham chiếu xuất hiện dưới dạng cột đầu tiên.

[2011/11/18 15:07:04] [HY000] [1005] Không thể tạo bảng 'realtorprint_dev_dev # sql-7d0_80.' (Errno: 150)

Cả OrderLineItem. shippingType và ShippingType.name có một loại varchar (50) không null. ShippingType.name là khóa chính của ShippingType.

Đây là kết quả của chương trình tạo bảng trên ShippingType cũng như OrderLineItem ...

CREATE TABLE `shippingtype` (
    `name` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '', 
    `description` varchar(255) CHARACTER SET latin1 NOT NULL, 
    PRIMARY KEY (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `orderlineitem` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `description` varchar(255) CHARACTER SET latin1 NOT NULL, 
    `lineNumber` int(11) NOT NULL, 
    `quantity` int(11) NOT NULL, 
    `quantityMultiplier` int(11) NOT NULL, 
    `unitPrice` decimal(10,2) NOT NULL, 
    `order_id` bigint(20) NOT NULL, 
    `productDefinition_id` bigint(20) NOT NULL, 
    `mlsId` varchar(255) CHARACTER SET latin1 DEFAULT NULL, 
    `printProviderUnitCost` decimal(10,2) NOT NULL, 
    `shippingType` varchar(50) NOT NULL, 
    `address` varchar(255) DEFAULT NULL, 
    `zipPostal` varchar(255) NOT NULL, 
    `city` varchar(255) NOT NULL, 
    `stateProvince` varchar(255) NOT NULL, 
    `country` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `idx_OrderLineItem_productDefinition_id` (`productDefinition_id`), 
    KEY `idx_OrderLineItem_order_id` (`order_id`), 
    CONSTRAINT `FK_OrderLineItem_order_id` FOREIGN KEY (`order_id`) REFERENCES `userorder` (`id`), 
    CONSTRAINT `FK_OrderLineItem_productDefinition_id` FOREIGN KEY (`productDefinition_id`) REFERENCES `productdefinition` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=10029 DEFAULT CHARSET=utf8; 
+0

Tôi đã bỏ lỡ một chút về nó là khóa chính. Hãy để tôi kiểm tra –

+1

Làm việc cho tôi - là các cột chính xác cùng loại trong cả hai bảng? Tôi đã nhìn thấy điều này khi có một loại không phù hợp nhỏ (collation vv) –

+0

Wow, có vẻ như bạn đã đúng. – benstpierre

Trả lời

29

Có thể là Mysql cho lỗi xấu này khi các loại cột không phù hợp chính xác - kiểm tra đối chiếu/kích thước vv

+2

Đó là sự thật! Dammint "unsigned" trong "tạo bảng" tuyên bố! Cảm ơn bạn! – orafaelreis

+0

Đừng nghĩ rằng những kẻ mà lỗi không nói gì về vấn đề này, tôi coi đây là một phong cách lập trình tồi! – Adelin

5

orderLineItem.shippingType có bộ ký tự utf8, nhưng ShippingType.name có bộ ký tự latin1. Đây không phải là tương thích cho các mục đích của tài liệu tham khảo khóa nước ngoài.