2011-11-18 18 views
12

He intentado agregar una clave externa como esto ...MySQL 5.5 añadir clave externa falla con errores [HY000] [150] y [HY000] [1005]

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

O como esta en MySQL 5.5. ..

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

Cada vez que veo el siguiente error.

[2011-11-18 15:07:04] [HY000] [150] Crear una tabla 'realtorprint_dev_dev/#sql-7d0_80' con restricción de clave externa falló. No hay un índice en la tabla referenciada donde las columnas referenciadas aparecen como las primeras columnas.

[2011-11-18 15:07:04] [HY000] [1005] No se puede crear la tabla 'realtorprint_dev_dev #sql-7d0_80.' (Error: 150)

Tanto OrderLineItem. shippingType y ShippingType.name tienen un tipo de varchar (50) no nulo. ShippingType.name es la clave principal de ShippingType.

Este es el resultado del programa de creación de tabla de Tipo de envío, así como 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

Me perdí la parte de que era la clave principal. Déjame revisar –

+1

Funciona para mí: ¿las columnas son exactamente del mismo tipo en ambas tablas? Lo he visto cuando hay un ligero desajuste de tipo (intercalación, etc.) –

+0

Guau, parece que tenía razón. – benstpierre

Respuesta

29

Es posible es que MySQL le da a este mal de error cuando los tipos de columna no coinciden exactamente - comprobar la intercalación/tamaño, etc.

+2

¡Es verdad! Dammint "unsigned" en la declaración "create table"! ¡Gracias! – orafaelreis

+0

No creas chicos que el error no dice nada sobre el problema, ¡considero que es un mal estilo de programación! – Adelin

5

orderLineItem.shippingType tiene el conjunto de caracteres utf8, pero ShippingType.name tiene el conjunto de caracteres latin1. Estos no son compatibles para propósitos de referencias de claves extranjeras.

Cuestiones relacionadas