Невозможно создать таблицу (errno: 150) InnoDB, добавив ограничения внешнего ключа - PullRequest
6 голосов
/ 25 августа 2011

Очень не хочется использовать время других людей, но, похоже, проблема просто не уходит.

Я рассмотрел все рекомендации на http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ и на http://forums.mysql.com/read.php?22,19755,19755#msg-19755, но ничего.

надеюсь, что кто-то укажет на глупую ошибку.

вот таблицы:

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;

Код ошибки: 1005. Невозможно создать таблицу shop.product_category (номер ошибки: 150)

Ответы [ 2 ]

9 голосов
/ 25 августа 2011

Вам нужен индекс для category_id в таблице категорий (я вижу, что это часть первичного ключа, но, поскольку это второй столбец в индексе, его нельзя использовать).Поле, на которое вы ссылаетесь во внешнем ключе, всегда должно быть проиндексировано.

1 голос
/ 30 июня 2015

В моем случае проблема была больше похожа на ту, что была описана в первой статье, на которую вы ссылались.

Так что мне просто нужно убедиться, что:

  • Referenced Column является индексом,
  • и Referencing Column, и Referenced Column имеют одинаковый тип идлина, т. е. оба значения INT(10),
  • имеют одинаковую не нулевую , unsigned , нулевое заполнение и т. д. Конфигурация.
  • обе таблицы InnoDB !

Вот шаблон запроса, где Referencing Column равно referencing_id и Referenced Column равно 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;

Обновление 2016-03-13 : Я снова столкнулся с этой проблемой и в итоге нашел свой собственный ответ.На этот раз это не помогло.Оказывается, другая таблица все еще была настроена на MyISAM, как только я изменил ее на InnoDB, все заработало.

...