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 ]

0 голосов
/ 25 июня 2015

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

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

0 голосов
/ 21 марта 2015

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

0 голосов
/ 29 декабря 2014

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

Например:

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 таблицы товаров.

0 голосов
/ 12 июня 2014

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

0 голосов
/ 13 декабря 2013

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

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

Field Type
Field Collation
Table Engine
0 голосов
/ 16 августа 2016

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

0 голосов
/ 01 февраля 2013

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

0 голосов
/ 06 апреля 2013

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

0 голосов
/ 21 февраля 2013

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

Например:

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

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

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

0 голосов
/ 09 февраля 2013

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

...