MySQL. Не могу создать таблицу errno 150 - PullRequest
68 голосов
/ 17 ноября 2009

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

Вот скрипт:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )

 ENGINE = InnoDB;


 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
   FOREIGN KEY (`field1`)
   REFERENCES `testdb`.`table1` (`field1` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)

 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Я пробовал это в Windows и Ubuntu с разными версиями MySQL и не работал.

Есть идеи?

Ответы [ 22 ]

54 голосов
/ 17 ноября 2009

table1.field1 не имеет определенного индекса.

Требуется установить ограничение FOREIGN KEY на field1.

С этим:

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

Тогда все должно работать как положено.

50 голосов
/ 11 мая 2013

При работе с MySQL Workbench и MySQL 5.5.27 я столкнулся с подобной проблемой. В моем случае проблема была с полями типа INT. Ошибочно в одной таблице это было INT UNSIGNED и в таблице ссылок это было INT.

13 голосов
/ 17 ноября 2009

В зависимости от версии MySQL может потребоваться сначала создать индекс для table1.field1.

8 голосов
/ 24 июня 2013

Один из ответов здесь предлагает отключить проверку целостности внешнего ключа. Это плохая идея. Здесь есть два вероятных виновника:

  • Несоответствие типов данных между указанным первичным ключом и внешним ключом
  • Индексы. Любые внешние ключи, которые вы индексировали, должны иметь значение NOT NULL
6 голосов
/ 22 мая 2013

Еще один намек:

Даже когда ваши типы данных кажутся одинаковыми - в моем случае оба столбца имели VARCHAR(50) - этого недостаточно.

Вам также необходимо убедиться, что оба столбца имеют одинаковые COLLATION.

5 голосов
/ 31 декабря 2013

MySQL также выдаст эту ошибку, если вы неправильно наберете имя ссылающейся таблицы. Я выдернул волосы на некоторое время, пока не понял, что пропустил письмо в foreign key (column1) references mistyped_table(column1)

5 голосов
/ 18 ноября 2013

Еще одна причина, хотя и немного похожая на другие: я имел в виду таблицу, в которой вместо InnoDB был установлен механизм MyISAM.

5 голосов
/ 05 февраля 2013

Опция (в зависимости от случая) будет отключать проверку целостности MySQL:

SET FOREIGN_KEY_CHECKS = 0;
1 голос
/ 26 октября 2012

Если ничего не работает, попробуйте это:

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

0 голосов
/ 28 марта 2016

Если вы работаете в MySQL Workbench и получаете эту ошибку для таблицы отношений, может быть быстрое решение для вас: просто удалите ее и позвольте MySQL Workbench воссоздать ее для вас. Затем скопируйте sql. Исправлена ​​ошибка с ошибкой 150.

...