Код ошибки: 1005. Невозможно создать таблицу '...' (номер ошибки: 150) - PullRequest
98 голосов
/ 26 января 2012

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

Я хочу создать внешний ключ от таблицы sira_no до metal_kod.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

Этот скрипт возвращает:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

Я попытался добавить индекс в ссылочную таблицу:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

Я проверил METAL_KODU в обеих таблицах (кодировка и сопоставление), но не смог найти решение этой проблемы. Как я могу решить эту проблему?

Вот таблица metal_kod:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100

Ответы [ 11 ]

260 голосов
/ 26 января 2012

Код ошибки: 1005 - неверная ссылка на первичный ключ в вашем коде

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

Некоторые известные причины могут быть:

  1. Тип и / или размер двух ключевых полей не совпадают точно.Например, если оно равно INT(10), ключевое поле должно быть также INT(10), а не INT(11) или TINYINT.Возможно, вы захотите подтвердить размер поля, используя SHOW CREATE TABLE, потому что Query Browser иногда визуально отображает только INTEGER для INT(10) и INT(11).Вы также должны проверить, что один не SIGNED, а другой UNSIGNED.Они оба должны быть абсолютно одинаковыми.
  2. Одно из ключевых полей, на которое вы пытаетесь сослаться, не имеет индекса и / или не является первичным ключом.Если одно из полей в связи не является первичным ключом, необходимо создать индекс для этого поля.
  3. Имя внешнего ключа является дубликатом уже существующего ключа.Убедитесь, что имя вашего внешнего ключа является уникальным в вашей базе данных.Просто добавьте несколько случайных символов в конец имени вашего ключа, чтобы проверить это.
  4. Одна или обе ваши таблицы - это таблица MyISAM.Чтобы использовать внешние ключи, обе таблицы должны быть InnoDB.(На самом деле, если обе таблицы MyISAM, вы не получите сообщение об ошибке - он просто не создаст ключ.) В Query Browser вы можете указать тип таблицы.
  5. Вы указаликаскад ON DELETE SET NULL, но для соответствующего ключевого поля установлено значение NOT NULL.Это можно исправить, изменив каскад или установив в поле значения NULL.
  6. Убедитесь, что параметры Charset и Collate одинаковы как на уровне таблицы, так и на уровне отдельных полей дляключевые столбцы.
  7. У вас есть значение по умолчанию (то есть по умолчанию = 0) в столбце внешнего ключа
  8. Одно из полей в связи является частью комбинированного (составного) ключа ине имеет своего индивидуального индекса.Даже если у поля есть индекс как часть составного ключа, вы должны создать отдельный индекс только для этого ключевого поля, чтобы использовать его в ограничении.
  9. В вашем ALTER имеется синтаксическая ошибкаили вы набрали одно из имен полей в отношении
  10. Имя вашего внешнего ключа превышает максимальную длину в 64 символа.

Для получения дополнительной информации обратитесь к: MySQL Error Number 1005 Не удается создать таблицу

11 голосов
/ 07 мая 2015

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

Просто добавьте следующее в ваш скрипт:

SET FOREIGN_KEY_CHECKS=0;

и оно должно работать.

4 голосов
/ 01 февраля 2015

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

Поэтому попробуйте удалить все ОГРАНИЧЕНИЯ внешнего ключа из всех таблиц, если они есть.любые, а затем обновить или создать таблицу.

3 голосов
/ 25 августа 2014

Очень часто это происходит, когда внешний ключ и ссылочный ключ не имеют одинаковый тип или одинаковую длину.

2 голосов
/ 14 июля 2016

У меня была похожая ошибка. Проблема была связана с тем, что у дочерней и родительской таблиц не было одинакового набора символов и параметров сортировки. Это можно исправить, добавив ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... в операторе SQL означает, что отсутствует какой-либо код.

2 голосов
/ 07 мая 2016

Код ошибки: 1005

У меня была похожая проблема, поэтому вот несколько вещей, которые я попробовал (ни в каком порядке, кроме решения :))

  1. Изменены имена внешних ключей (это не работало)
  2. Уменьшена длина внешнего ключа
  3. Проверены типы данных (чертовски ничего плохого)
  4. Проверьте индексы
  5. Проверьте параметры сортировки (все в порядке, штопать снова)
  6. Усеченный стол, бесполезный
  7. Уронил стол и заново создал
  8. Попытался увидеть, есть ли круговойссылка создается - все отлично
  9. Наконец, я увидел, что у меня открыто два редактора.Один, который в PhpStorm (JetBrains) и другой MySQL верстак.Кажется, что PhpStorm / MySQL Workbench создает какую-то блокировку редактирования.

    Я закрыл PhpStorm, просто чтобы проверить, была ли блокировка (это могло быть наоборот).Это решило мою проблему.

1 голос
/ 15 февраля 2017

Внешний ключ должен иметь тот же тип, что и первичный ключ, на который он ссылается. Так как в примере есть тип «INT UNSIGNED NOT NULL», ключ foreing также должен иметь значение «INT UNSIGNED NOT NULL»

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';
1 голос
/ 07 февраля 2017

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

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

против

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Интересно, почему MySQL не может сказать, что такая таблица не существует ...

1 голос
/ 10 марта 2015

Это произошло в моем случае, потому что имя таблицы, на которую ссылаются в объявлении ограничения, было неправильным (я забыл верхний регистр в имени таблицы):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
0 голосов
/ 28 марта 2016

В моем случае это произошло, когда одна таблица InnoB, а другая MyISAM.Изменение движка одной таблицы через MySQL Workbench решает за меня.

...