2011-11-18 10 views
12

Próbowałem dodając klucz obcy jak to ...MySQL 5.5 dodać klucz obcy nie z błędów [HY000] [150] i [HY000] [1005]

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

Albo jak to w MySQL 5.5. ..

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

Za każdym razem, gdy widzę następujący błąd.

[2011-11-18 15:07:04] [HY000] [150] Tworzenie tabeli 'realtorprint_dev_dev/# sql-7d0_80' z klucza obcego nie powiodło się. Brak indeksu w przywoływanej tabeli, w której kolumny z odniesieniami pojawiają się jako pierwsze kolumny.

[2011-11-18 15:07:04] [HY000] [1005] Nie można utworzyć tabelę 'realtorprint_dev_dev # sql-7d0_80. (Errno: 150)

Zarówno OrderLineItem. shippingType i ShippingType.name mają typ varchar (50) nie ma wartości null. ShippingType.name to primaryKey of ShippingType.

Tutaj jest wynikiem pojawienia utworzyć tabela Rodzaj wysyłki jak również 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ęsknię za tym, że jest to klucz podstawowy. Pozwól mi sprawdzić –

+1

Działa dla mnie - czy kolumny są dokładnie tego samego typu w obu tabelach? Widziałem to, gdy występuje niewielkie niedopasowanie typu (sortowanie itp.) –

+0

Wow, wygląda na to, że miałeś rację. – benstpierre

Odpowiedz

29

Jest to możliwe jest, że MySQL daje to poważny błąd, gdy typy kolumn nie pasują dokładnie - sprawdź sortowania/rozmiar itp.

+2

To prawda! Dammint "unsigned" w instrukcji "Utwórz tabelę"! Dziękuję Ci! – orafaelreis

+0

Nie myśl, że ten błąd nie mówi nic na temat problemu, uważam to za zły styl programowania! – Adelin

5

orderLineItem.shippingType ma zestaw znaków utf8, ale ShippingType.name ma zestaw znaków latin1. Nie są one kompatybilne do celów kluczowych referencji zagranicznych.