2012-03-30 18 views
7

tengo esta tabla:MySQL Error: # 1005 - No se puede crear la tabla (errno: 150) Cuando intento crear más de 1 FK

CREATE TABLE IF NOT EXISTS `produtos` (
    `id` int(11) NOT NULL auto_increment, 
    `idcatprodutos` int(11) NOT NULL, 
    `idcategoria` int(11) NOT NULL, 
    `idmarca` int(11) NOT NULL, 
    `nome` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_produtos_2` (`idcatprodutos`), 
    KEY `FK_produtos_3` (`idmarca`), 
    KEY `FK_produtos_4` (`idcategoria`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=39 ; 

y esta tabla:

CREATE TABLE IF NOT EXISTS `sugestoes` (
    `id` int(11) NOT NULL auto_increment, 
    `idproduto` int(11) NOT NULL, 
    `idsugestao1` int(11) NOT NULL, 
    `idsugestao2` int(11) NOT NULL, 
    `idsugestao3` int(11) NOT NULL, 
    `idsugestao4` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_sugestoes_prod` (`idproduto`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED AUTO_INCREMENT=9 ; 

Ya he creado un fk sugestoes.idproduto -> produtos.id en funcionamiento, pero quiero que cada uno de los otros campos también se refiera al produtos.id a través del nuevo FK. Ejecutar este comando a continuación que el retorno de MySQL Error: # 1005 - No se puede crear la tabla (errno: 150):

ALTER TABLE `infantile`.`sugestoes` ADD CONSTRAINT `FK_sugestoes_2` FOREIGN KEY `FK_sugestoes_2` (`idsugestao1`) 
    REFERENCES `produtos` (`id`) 
    ON DELETE SET NULL 
    ON UPDATE CASCADE 
, ROW_FORMAT = FIXED; 

¿Alguien tiene alguna idea de lo que está pasando?

+0

¿Por qué agrega que ', ROW_FORMAT = FIJO' en la 'ALTER TABLE'? –

Respuesta

10

Prueba de esto,

funciona:

ALTER TABLE `sugestoes` 
ADD CONSTRAINT `FK_idproduto_produtos_1` FOREIGN KEY (`idproduto`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_2` FOREIGN KEY (`idsugestao1`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_3` FOREIGN KEY (`idsugestao2`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_4` FOREIGN KEY (`idsugestao3`) REFERENCES `produtos` (`id`), 
ADD CONSTRAINT `FK_sugestoes_produtos_5` FOREIGN KEY (`idsugestao4`) REFERENCES `produtos` (`id`) 

ACTUALIZACIÓN:

vez no pueda especificar

ON DELETE SET NULL 

Debido a esto:

Ha definido una condición SET NULL aunque algunos de los columnas se definen como NOT NULL

Se puede ver error exacto cuando se ejecuta

SHOW ENGINE INNODB STATUS; 
+1

Trabajos más largos no resuelven mi problema, Necesito EN ELIMINAR SET NULL y SET OnUpdate Cascade, cuando intento hacer estos cambios, aparece el mismo mensaje de error. – user1068478

+2

Ver mi respuesta actualizada – rkosegi

+0

Necesito cuando el usuario ELIMINE algún producto.idproduto el correspondiente sugestao.idsugestao sea nulo o esté vacío, ¿cómo puedo configurarlo? – user1068478

0

eliminación Quizás el ROW_FORMAT = FIXED:

ALTER TABLE `infantile`.`sugestoes` 
    ADD CONSTRAINT `FK_sugestoes_2` 
    FOREIGN KEY `FK_sugestoes_2` (`idsugestao1`) 
     REFERENCES `produtos` (`id`) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
; 

En En segundo lugar, ¿cómo espera que el ON DELETE SET NULL se comporte cuando su columna está definida con NOT NULL?


Y tercero, ¿la tabla tiene algún dato en ella? Si algunas de las filas violan esta restricción FK, entonces no puedes crear esa FK.

Cuestiones relacionadas