2011-11-18 18 views
12

Ho provato ad aggiungere una chiave esterna come questo ...MySQL 5.5 aggiungere chiave esterna non riesce con errori [HY000] [150] e [HY000] [1005]

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

O come questo in MySQL 5.5. ..

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

Ogni volta che vedo il seguente errore.

[2011-11-18 15:07:04] [HY000] [150] Crea una tabella 'realtorprint_dev_dev/# sql-7d0_80' con vincolo di chiave esterna non è riuscita. Non vi è alcun indice nella tabella di riferimento in cui le colonne di riferimento vengono visualizzate come prime colonne.

[2011-11-18 15:07:04] [HY000] [1005] Non è possibile creare la tabella 'realtorprint_dev_dev # sql-7d0_80.' (Errno: 150)

Entrambi OrderLineItem. shippingType e ShippingType.name hanno un tipo di varchar (50) non null. ShippingType.name è il primaryKey di ShippingType.

Ecco il risultato di spettacolo creare tabella a ShippingType così come 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

Mi mancava il fatto che fosse la chiave primaria. Fammi controllare –

+1

Works for me - le colonne sono esattamente dello stesso tipo in entrambe le tabelle? L'ho visto quando c'è una leggera mancata corrispondenza di tipo (regole di confronto ecc.) –

+0

Wow, sembra che tu avessi ragione. – benstpierre

risposta

29

E 'possibile è che Mysql dà questo cattivo errore quando i tipi di colonna non corrispondono esattamente - controllare le regole di confronto/dimensioni ecc.

+2

È vero! Dammint "unsigned" nell'istruzione "create table"! Grazie! – orafaelreis

+0

Non pensare che l'errore non dica nulla sul problema, lo considero uno pessimo stile di programmazione! – Adelin

5

orderLineItem.shippingType ha il set di caratteri utf8, ma ha il set di caratteri latin1. Questi non sono compatibili ai fini delle referenze di chiavi straniere.