2012-03-30 12 views
7

mam poniższej tabeli:MySQL Error: # 1005 - Nie można utworzyć tabelę (errno: 150) Kiedy próbuję utworzyć więcej niż 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 ; 

oraz poniższej tabeli:

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 ; 

Stworzyłem już fk sugestoes.idproduto -> produtos.id działający, ale chcę, aby każde z pozostałych pól również odnosiło się do produtos.id poprzez nowe FK. Run to polecenie poniżej tej powrotnej MySQL Error: # 1005 - Nie można utworzyć tabelę (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; 

Czy ktoś ma jakiś pomysł, co się dzieje?

+0

Dlaczego dodajesz, 'ROW_FORMAT = FIXED' w" ALTER TABLE "? –

Odpowiedz

10

Spróbuj tego,

to działa:

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`) 

UPDATE:

Nie można określić

ON DELETE SET NULL 

z tego powodu:

Zdefiniowano Warunkiem SET NULL chociaż niektóre kolumn są zdefiniowane jako NOT NULL

można zobaczyć dokładny opis błędu podczas uruchamiania

SHOW ENGINE INNODB STATUS; 
+1

Dłuższe prace nie rozwiązują mojego problemu, Potrzebuję NA USUŃ USTAW NULL i USTAW Kaskadę OnUpdate, gdy próbuję wprowadzić te zmiany, pojawia się ten sam komunikat o błędzie. – user1068478

+2

Zobacz moją zaktualizowaną odpowiedź – rkosegi

+0

Potrzebuję, gdy użytkownik USUNIĘCIE jakiegoś produto.idproduto odpowiadającego sugestao.idsugestao jest pusty lub pusty, jak mogę go ustawić? – user1068478

0

Może usunięcie 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 
; 

On druga myśl, jak możesz się spodziewać zachowania się ON DELETE SET NULL, gdy twoja kolumna jest zdefiniowana z NOT NULL?


Po trzecie, czy tabela zawiera jakiekolwiek dane? Jeśli niektóre wiersze naruszają to ograniczenie FK, nie można utworzyć tego FK.