2011-08-25 14 views
6

Realmente odio usar el tiempo de otras personas, pero parece que el problema simplemente no desaparece.No se puede crear la tabla (errno: 150) InnoDB añadiendo restricciones de clave externa

Consideré todas las recomendaciones en http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ y en http://forums.mysql.com/read.php?22,19755,19755#msg-19755 pero nada.

espero que alguien señale un error estúpido.

aquí son las tablas: Código

CREATE TABLE IF NOT EXISTS `shop`.`category` (
    `id` INT(11) NOT NULL AUTO_INCREMENT , 
    `category_id` INT(11) NOT NULL , 
    `parent_id` INT(11) NULL DEFAULT '0' , 
    `lang_id` INT(11) NOT NULL , 
    ...other columns... 
    PRIMARY KEY (`id`, `category_id`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 



CREATE TABLE IF NOT EXISTS `shop`.`product_category` (
    `category_id` INT(11) NOT NULL , 
    `product_id` INT(11) NOT NULL , 
    INDEX `fk_product_category_category1_zxc` (`category_id` ASC) , 
    CONSTRAINT `fk_product_category_category1_zxc` 
    FOREIGN KEY (`category_id`) 
    REFERENCES `shop`.`category` (`category_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 

de error: 1005. No se puede crear la tabla 'shop.product_category' (Error: 150)

Respuesta

9

Es necesario un índice en category_id en la tabla de categorías (Veo que es parte de la clave principal, pero como es la segunda columna del índice, no se puede usar). El campo al que hace referencia en una clave externa siempre debe estar indexado.

+0

Gracias! ¡Esto resolvió el problema! –

+0

Si esto resolvió el problema, ¡marque la respuesta como aceptada! – ddinchev

+0

Disculpa, ¿cómo hago eso? –

1

En mi caso, el problema se parecía más a lo que se describió en el primer artículo al que se ha vinculado.

Así que sólo tenía que asegurarse de que:

  • Referenced Column es un índice,
  • tanto Referencing Column y Referenced Column comparten el mismo tipo y longitud, es decir, por ejemplo, ambos son INT(10),
  • ambos comparten la misma no nula, unsigned, zerofill etc. configuración.
  • ¡ambas tablas son InnoDB!

Aquí está la plantilla de consulta donde Referencing Column es referencing_id y Referenced Column es referenced_id:

ALTER TABLE `db`.`referencing` 
ADD CONSTRAINT `my_fk_idx` 
FOREIGN KEY (`referencing_id`) 
REFERENCES `db`.`referenced`(`referenced_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION; 

actualización 03/13/2016: encontramos con este problema de nuevo, terminamos encontrar mi propia respuesta. Esta vez no ayudó sin embargo. Resulta que la otra mesa todavía estaba configurada en MyISAM, tan pronto como lo cambié a InnoDB todo funcionó.

Cuestiones relacionadas