Mysql. Не могу создать таблицу errno 150

Я должен создать БД с 2 таблицами в 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 ответа

Решение

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;

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

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

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

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

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

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

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

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

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

SET FOREIGN_KEY_CHECKS = 0;

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

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

Я получил эту ошибку при попытке использовать внешний ключ для ссылки на неуникальное поле. (что, по- видимому, не допускается)

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

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

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

Оказалось, что innoDB был сломан, см.: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tried-to-a?lq=1 while-tried-to- стоит ? LQ = 1

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

Например:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

В этом случае важно использовать article_id и поле type в определении FK в том же порядке, в котором они указаны в определении PRIMARY KEY таблицы товаров.

Всегда сначала создавайте основные / родительские таблицы, а затем создавайте подробные / дочерние таблицы.

В случае, если у кого-то все еще есть проблемы с этим, я попробовал все решения выше (кроме SET FOREIGN_KEY_CHECKS), и ничего не работало. Проблема заключалась в том, что когда вы ссылаетесь на первую таблицу, некоторые базы данных чувствительны к регистру имен таблиц. Я думаю, что это странно, так как я никогда не видел этого раньше на MySQL, Oracle, и теперь это случилось со мной на MariaDB.

Например:

Создать таблицу, если она не существует CADASTRO_MAQUINAS ( Id VARCHAR(16), Первичный ключ (Id));

Создать таблицу, если она не существует INFOS ( Id_Maquina VARCHAR(16) NOT NULL, CONSTRAINT FK_infos_cadastro_maquinas Внешний ключ (Id_Maquina) ссылается на CADASTRO_MAQUINAS(Id));

Если я попытаюсь создать вторую таблицу, используя cadastro_maquinas (строчные буквы) вместо CADASTRO_MAQUINAS, я получу эту ошибку.

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

Для меня проблема была с использованием CONSTRAINT в CREATE TABLE запрос.

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

Так что это может произойти из-за несоответствий между двумя определениями баз данных / полей, попробуйте проверить:

Field Type
Field Collation
Table Engine

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

Когда у меня возникла эта проблема, это было потому, что я установил идентификатор в первой таблице, чтобы unsigned тогда как внешнего ключа во второй таблице не было. Делая их обоих unsigned исправил это для меня.

Я использовал MySQL workBench, Проблема в том, что вы не можете использовать то же самое foreign key nameони должны быть unique, Таким образом, если несколько таблиц будут ссылаться на один и тот же внешний ключ, каждый раз unique имя дано.

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

У меня была похожая ошибка на одной из моих таблиц. Если флажок Collation был разным, это сработало, когда оба столбца изменились на один и тот же тип сортировки.

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

1, проверьте CASE столбца 2, проверьте COLLATION столбцов 3, проверьте, существует ли ключ, созданный в обеих таблицах для столбца (уникальный, основной)

Другие вопросы по тегам