MySQL: невозможно создать таблицу (номер ошибки: 150) - PullRequest
149 голосов
/ 31 октября 2010

Я пытаюсь импортировать файл .sql и при создании таблиц происходит сбой.

Вот запрос, который не удался:

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;    

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

MySQL: невозможно создать таблицу './dbname/data.frm' (номер ошибки: 150)

Ответы [ 33 ]

160 голосов
/ 31 октября 2010

Из документации MySQL - FOREIGN KEY Ограничения :

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

97 голосов
/ 31 октября 2010

Ошибка 150 означает, что у вас есть проблема с вашим внешним ключом.Возможно, ключ на чужой таблице не тот же тип?

59 голосов
/ 23 июля 2014

Фактическое сообщение об ошибке можно получить, запустив SHOW ENGINE INNODB STATUS;, а затем найдя LATEST FOREIGN KEY ERROR в выводе.

Источник: ответ от другого пользователя на похожий вопрос

28 голосов
/ 09 декабря 2010

Типы данных должны точно совпадать.Если вы имеете дело с типами varchar, в таблицах должно использоваться одно и то же сопоставление.

24 голосов
/ 25 апреля 2013

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

Фактический ответ таков до начала восстановления, если вы восстанавливаете файл дампа с внешними ключами:

SET FOREIGN_KEY_CHECKS=0;

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

21 голосов
/ 03 августа 2011

В некоторых случаях вы можете столкнуться с этим сообщением об ошибке, если между связанными таблицами есть разные механизмы.Например, таблица может использовать InnoDB, в то время как другая использует MyISAM.Оба должны быть одинаковыми

11 голосов
/ 31 октября 2010

Ошибка №150 означает сбой ограничения внешнего ключа.Вы, вероятно, создаете эту таблицу до таблицы, от которой зависит внешний ключ (таблица keywords).Сначала создайте эту таблицу, и она должна работать нормально.

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

10 голосов
/ 18 марта 2015

Есть несколько вещей, которые могут вызвать ошибку 150, поэтому для людей, ищущих эту тему, вот что я думаю, это почти полный список (источник Причины ошибки Errno 150 ):

Для errno 150 или errno 121, просто набрав в SHOW ENGINE INNODB STATUS, есть раздел, который называется «LATEST FOREIGN KEY ERROR». При этом он даст вам очень полезное сообщение об ошибке, которое, как правило, сразу скажет вам, в чем дело. Вам нужны привилегии SUPER для его запуска, поэтому, если у вас его нет, вам просто нужно протестировать следующие сценарии.

1) Типы данных не совпадают: типы столбцов должны быть одинаковыми

2) Родительские столбцы не проиндексированы (или проиндексированы в неправильном порядке)

3) Столбцы столбцов не совпадают

4) Использование SET NULL в столбце NOT NULL

5) Совпадения таблиц не совпадают: даже если сопоставления столбцов совпадают, в некоторых версиях MySQL это может быть проблемой.

6) Родительский столбец фактически не существует в родительской таблице. Проверьте орфографию (и, возможно, пробел в начале или конце столбца)

7) Один из индексов в одном из столбцов является неполным или столбец слишком длинный для полного индекса. Обратите внимание, что максимальная длина ключа в одном столбце (если вы его не настроите) составляет 767 байт (это соответствует столбцу UTF varchar (255))

В случае, если вы получите errno 121, вот несколько причин:

1) Выбранное вами имя ограничения уже занято

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

8 голосов
/ 18 июля 2013

Иногда MySQL просто супер глупый - я могу понять причину внешних ключей ... но в моем случае я просто отбросил всю базу данных, и все равно получаю ошибку ... почему?я имею в виду, что базы данных больше нет ... и используемый мной sql-пользователь не имеет доступа ни к каким другим БД на сервере ... я имею в виду, что сервер "пуст" для текущего пользователя, и я все еще получаюэта ошибка?Извините, но я предполагаю, что MySQL лжет мне ... но я могу с этим справиться :) Просто добавьте эти две строки SQL к вашему гребаному утверждению:

SET FOREIGN_KEY_CHECKS = 0;
# some code that gives you errno: 150
SET FOREIGN_KEY_CHECKS = 1;

Теперь SQL должен быть выполнен ...Если у вас действительно есть проблема с внешним ключом, она появится у вас на линии, где вы снова включите проверки - тогда это не удастся ... но мой сервер просто тихий:)

4 голосов
/ 23 апреля 2014

Я столкнулся с этой ошибкой при портировании приложения Windows на Linux.В Windows имена таблиц базы данных нечувствительны к регистру, а в Linux они чувствительны к регистру, вероятно, из-за различий в файловой системе.Таким образом, в Windows таблица Table1 совпадает с table1, а в REFERENCES работают table1 и Table1.В Linux, когда приложение использовало table1 вместо Table1, когда оно создавало структуру базы данных, я видел ошибку # 150;когда я сделал правильный регистр символов в ссылках Table1, он начал работать и в Linux.Поэтому, если больше ничего не помогает, убедитесь, что в REFERENCES вы используете правильный регистр символов в имени таблицы при работе в Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...