Ошибка MySQL: # 1005 - Невозможно создать таблицу (ошибка: 150). При попытке создать более 1 FK - PullRequest
7 голосов
/ 30 марта 2012

У меня есть эта таблица:

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 ;

и эта таблица:

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 ;

Я уже создал fk sugestoes.idproduto -> produtos.id, работающий, но я хочу, чтобы все остальные поля также ссылались на produtos.id через новый FK. Запустите эту команду ниже, чтобы вернуть MySQL Error: # 1005 - Невозможно создать таблицу (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;

Кто-нибудь знает, что происходит?

Ответы [ 2 ]

10 голосов
/ 30 марта 2012

Попробуйте,

работает:

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

ОБНОВЛЕНИЕ:

Нельзя указать

ON DELETE SET NULL

Из-за этого:

Вы определили условие SET NULL, хотя некоторые столбцы определены как NOT NULL

Вы можете увидеть точную ошибку при запуске

SHOW ENGINE INNODB STATUS;
0 голосов
/ 30 марта 2012

Возможно, удалив 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 DELETE SET NULL будет вести себя, когда ваш столбец определен с NOT NULL?


И в-третьих, есть ли в таблице данные?Если некоторые строки нарушают это ограничение FK, вы не можете создать этот FK.

...