Не могу создать таблицу errno: 150 на Mysql - PullRequest
0 голосов
/ 04 марта 2012

я получаю еще одну ошибку 150 на MySQL. я уже смотрю на движок таблицы, тип столбца, но не повезло, на мой взгляд, в этом нет ничего плохого.

где я сейчас ошибаюсь?

Я получаю сообщение об ошибке при создании таблицы тегов, относящейся к image_tag и tag_lang.

-- -----------------------------------------------------
-- Table `ratna`.`image_tag`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ratna`.`image_tag` ;

CREATE  TABLE IF NOT EXISTS `ratna`.`image_tag` (
  `id` INT(11) NOT NULL ,
  `tag` INT(11) NOT NULL ,
  PRIMARY KEY (`id`, `tag`) ,
  INDEX `image_fk` (`id` ASC) ,
  CONSTRAINT `image_fk`
    FOREIGN KEY (`id` )
    REFERENCES `ratna`.`image` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;


-- -----------------------------------------------------
-- Table `ratna`.`tag_lang`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ratna`.`tag_lang` ;

CREATE  TABLE IF NOT EXISTS `ratna`.`tag_lang` (
  `id` INT(11) NOT NULL ,
  `lang` INT(20) NOT NULL ,
  `tag_desc` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
  PRIMARY KEY (`id`, `lang`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;


-- -----------------------------------------------------
-- Table `ratna`.`tag`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `ratna`.`tag` ;

CREATE  TABLE IF NOT EXISTS `ratna`.`tag` (
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL ,
  `seq` INT(11) NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `image_tag_fk` (`id` ASC) ,
  INDEX `tag_lang` (`id` ASC) ,
  CONSTRAINT `image_tag_fk`
    FOREIGN KEY (`id` )
    REFERENCES `ratna`.`image_tag` (`tag` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `tag_lang`
    FOREIGN KEY (`id` )
    REFERENCES `ratna`.`tag_lang` (`id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB
AUTO_INCREMENT = 13
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

Это:

    REFERENCES `ratna`.`image_tag` (`tag` )

недопустимо, поскольку image_tag не имеет индекса, начинающегося с tag.Как объяснено в документации :

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

(«Ссылочная таблица»case равен image_tag, а "ссылочные столбцы" просто tag.)

1 голос
/ 04 марта 2012

Первый результат Google для MySQL ошибка 150 показывает:

Если вы воссоздаете таблицу, которая была удалена, у нее должно быть определение, соответствующее ограничениям внешнего ключа, на которые она ссылается. У него должны быть правильные имена и типы столбцов, и он должен иметь индексы на ссылочных ключах, как указано ранее. Если они не удовлетворены, MySQL возвращает номер ошибки 1005 и ссылается на ошибку 150 в сообщении об ошибке.

Если MySQL сообщает об ошибке 1005 из оператора CREATE TABLE, и сообщение об ошибке ссылается на ошибку 150, создание таблицы завершилось неудачно, поскольку ограничение внешнего ключа было сформировано неправильно. Точно так же, если ALTER TABLE завершается ошибкой и ссылается на ошибку 150, это означает, что определение внешнего ключа будет неправильно сформировано для измененной таблицы. Вы можете использовать SHOW ENGINE INNODB STATUS для отображения подробного объяснения самой последней ошибки внешнего ключа InnoDB на сервере.

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

0 голосов
/ 25 марта 2013

в моем случае это был вопрос

ссылки на внешний ключ (table_column_name_in_smaller_case) primary_key_table_in_upper_case (table_column_name_in_smaller_case)

, поскольку моя таблица первичного ключа в нижнем регистре, я изменил эту верхнюю ссылку внешнего ключа с

* primary_key_table_in_upper_case *

до

* primary_key_table_in_lower_case *

и все заработало

...