Подтвердить что ты не робот

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

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

Вот сценарий:

 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @[email protected]@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 [email protected]_SQL_MODE;
 SET [email protected]_FOREIGN_KEY_CHECKS;
 SET [email protected]_UNIQUE_CHECKS;

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

Есть идеи?

4b9b3361

Ответ 1

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;

Все должно работать так, как ожидалось.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

SET FOREIGN_KEY_CHECKS = 0;

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

Если у кого-то все еще есть проблемы с этим, я попробовал все вышеперечисленные решения (кроме 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, я получу эту ошибку.

Ответ 13

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

Ответ 14

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

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

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

Ответ 15

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

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

Field Type
Field Collation
Table Engine

Ответ 16

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

Ответ 17

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

Например:

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.

Ответ 18

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

Ответ 19

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

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

Ответ 20

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

Ответ 21

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

Ответ 22

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

Ответ 23

** Пожалуйста, проверьте тип данных Изменение типа данных для обоих же **