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 ]

4 голосов
/ 03 июля 2013

После ознакомления с ответами выше и небольшой экспериментирования это эффективный способ решения ошибок внешнего ключа в MySQL (1005 - ошибка 150).

Для правильного создания внешнего ключа всеMySQL запрашивает следующее:

  • Все ссылочные ключи ДОЛЖНЫ иметь индекс PRIMARY или UNIQUE.
  • Повторная ссылка на столбец ДОЛЖНА иметь тип данных, идентичный столбцу ссылки.

Удовлетворите эти требования и все будет хорошо.

3 голосов
/ 10 июля 2018

У меня была такая же проблема. Это было связано с колонкой таблицы Сортировка и Набор символов . Убедитесь, что Набор символов и Сопоставление должны быть одинаковыми для обоих столбцов в двух таблицах. Если вы хотите установить внешний ключ на это. Пример - если вы поместите внешний ключ в столбец userID таблицы userImage, ссылающийся на столбец userID таблицы users. Тогда параметры сортировки должны быть такими же, как utf8_general_ci и набор символов utf8 для обоих столбцов таблиц. Обычно при создании таблицы mysql берет эти две конфигурации из настроек сервера.

3 голосов
/ 23 декабря 2013

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

3 голосов
/ 17 апреля 2012

Меняйте движки ваших таблиц, только innoDB поддерживает внешние ключи

3 голосов
/ 24 ноября 2017

обычно несоответствие между внешним ключом и первичным ключом вызывает ошибку: 150.

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

3 голосов
/ 16 октября 2012

Если таблица PK создана в одном CHARSET , а затем вы создаете таблицу FK в другом CHARSET .. то также вы можете получить эту ошибку ... Я тоже получил эту ошибку, но после изменения кодировки наPK charset, тогда он был выполнен без ошибок

create table users
(
------------
-------------
)DEFAULT CHARSET=latin1;


create table Emp
(
---------
---------
---------
FOREIGN KEY (userid) REFERENCES users(id) on update cascade on delete cascade)ENGINE=InnoDB, DEFAULT CHARSET=latin1;
3 голосов
/ 29 октября 2015

В моем случае.У меня были проблемы с engine и charset, потому что мой сервер хостинга изменил настройки и мои новые таблицы были MyISAM, но мои старые таблицы - InnoDB.Просто я изменился.

3 голосов
/ 16 июня 2015

В большинстве случаев проблема связана с ДВИЖЕНИЕМ ДВИГАТЕЛЯ. Если родительский объект создается InnoDB, тогда ссылочные таблицы должны создаваться MyISAM и наоборот

2 голосов
/ 24 октября 2016

У меня была похожая проблема, но моя была в том, что я добавлял новое поле в существующую таблицу, в которой были данные, а новое поле ссылалось на другое поле из родительской таблицы, а также имело определение NOT NULL и без DEFAULTЦЕННОСТИ.- Я выяснил причину, по которой все не работало, потому что

  1. Моему новому полю нужно было автоматически заполнить пустые поля значением из родительской таблицы в каждой записи, прежде чем можно было применить ограничение.Каждый раз, когда накладывается ограничение, необходимо сохранить целостность данных таблицы без изменений.Внедрение ограничения (внешнего ключа), хотя некоторые записи в базе данных не имеют значений из родительской таблицы, означало бы, что данные повреждены, поэтому MySQL НИКОГДА НЕ УТВЕРЖДАЕТ ВАШУ ОГРАНИЧЕНИЕ

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

Более простой подход, чтобы избежать этой ошибки, заключается в

  • Сохранение данных таблиц базы данных
  • Усечение данных таблицы (и артефактов таблицы, т. Е. Индексов и т. Д.)
  • Применение ограничений
  • Импорт данных

Надеюсь, это кому-нибудь поможет

2 голосов
/ 14 января 2016

Я столкнулся с такой проблемой при создании БД из текстового файла.

mysql -uroot -padmin < E:\important\sampdb\createdb.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\insert_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\insert_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\load_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\load_absence.sql 

Я только что написал вышеупомянутые строки в Create.bat и запустил файл bat.

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

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

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