it-swarm.com.ru

MySQL: не могу создать таблицу (номер ошибки: 150)

Я пытаюсь импортировать файл .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)

148
gtilx

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

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

160
OMG Ponies

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

96
Dan McGrath

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

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

58
Denilson Sá Maia

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

27
Esben Skov Pedersen

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

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

SET FOREIGN_KEY_CHECKS=0;

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

23
colin

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

20
pi.

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

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

11
Eran Galperin

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

Для errno 150 или errno 121, просто набрав в SHOW ENGINE INNODB STATUS, есть раздел под названием «ПОСЛЕДНЯЯ ОШИБКА ИНОСТРАННЫХ КЛЮЧЕЙ». При этом он даст вам очень полезное сообщение об ошибке, которое, как правило, сразу скажет вам, в чем дело. Вам нужны привилегии SUPER для его запуска, поэтому, если у вас его нет, вам просто нужно протестировать следующие сценарии.

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

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

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

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

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

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

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

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

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

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

10
juacala

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

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

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

8
jebbie

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

4
Vitaliy

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

Чтобы внешний ключ был правильно создан, MySQL запрашивает:

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

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

4
Davies Malesi

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

3
Ignacio Hernández

Измените движки ваших таблиц, только innoDB поддерживает внешние ключи

3
Lappies

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

3
Sushilkumar

Если таблица PK создается в однойCHARSET, а затем вы создаете таблицу FK в другой CHARSET .. тогда также вы можете получить эту ошибку ... Я тоже получил эту ошибку, но после изменения 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
tinku

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

3
Sunil Kumar Mohanty

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

3
manzarul haque

У меня была похожая проблема, но моя была в том, что я добавлял новое поле в существующую таблицу, в которой были данные, и новое поле ссылалось на другое поле из родительской таблицы, а также имело определение NOT NULL и без каких-либо ЗНАЧЕНИЙ ПО УМОЛЧАНИЮ. - Я выяснил причину, по которой вещи не работали, потому что 

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

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

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

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

Я надеюсь, что это помогает кому-то 

2
chitwarnold

У меня была такая же ошибка. В моем случае причиной ошибки было то, что в ограничении был оператор ON DELETE SET NULL, в то время как поле, в которое я поместил ограничение в его определении, содержало оператор NOT NULL. Разрешение NULL в поле решило проблему.

2
Wilbert van Diemen

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

2
Basit

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

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

2
Rakesh

В случае с Edge вы использовали инструмент MySQL (в моем случае Sequel Pro) для переименования базы данных. Затем создал базу данных с тем же именем.

Это сохраняло ограничения внешнего ключа для того же имени базы данных, поэтому переименованная база данных (например, my_db_renamed) имела ограничения внешнего ключа во вновь создаваемой базе данных (my_db)

Не уверен, что это ошибка в Sequel Pro, или если какой-то сценарий использования требует такого поведения, но это стоило мне большую часть утра: /

2
chim

У меня была похожая проблема при выгрузке базы данных Django mysql из одной таблицы. Мне удалось решить эту проблему, выгрузив базу данных в текстовый файл, переместив нужную таблицу в конец файла с помощью emacs и импортировав измененный файл дампа sql в новый экземпляр. 

HTH Uwe

1
hoover

Столбец таблицы PARENT, на которую вы ссылаетесь из дочерней таблицы, должен быть уникальным. Если это не так, вызвать ошибку № 150.

1
Dila Ram Gurung

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

Решение: сначала создайте родительские таблицы перед созданием дочерней таблицы с внешним ключом.

1
ronIT

Убедитесь, что все таблицы могут поддерживать внешний ключ - движок InnoDB 

1
joksy82

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

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. Я попытался создать таблицу с первичным ключом и внешним ключом. Во время работы он будет искать справочную таблицу, но таблиц там нет .., поэтому он будет возвращать подобные ошибки.

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

1
Dharani Dharan

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

1
Mukus

Я исправил проблему, заставив переменную принять null

ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR( 2 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
1
Fahmi

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

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

это сработало для меня ...

1
pooja patil

Создайте таблицу без внешнего ключа, затем установите внешний ключ отдельно.

1
stuckhelper

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

0
Piyush Agarwal