Код ошибки: 1005. Невозможно создать таблицу «…» (номер ошибки: 150)

103

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

Я хочу создать внешний ключ из таблицы 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
ламострета
источник
Можете ли вы показать схему metal_kodтаблицы ... какое поле в этой таблице должно ссылаться на внешний ключ?
Manse

Ответы:

271

Код ошибки: 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вы не получите сообщение об ошибке - он просто не создаст ключ.) В браузере запросов вы можете указать тип таблицы.
  5. Вы указали каскад ON DELETE SET NULL, но для соответствующего ключевого поля установлено значение NOT NULL. Вы можете исправить это, либо изменив каскад, либо установив в поле допустимые NULLзначения.
  6. Убедитесь, что параметры Charset и Collate одинаковы как на уровне таблицы, так и на уровне отдельных полей для ключевых столбцов.
  7. У вас есть значение по умолчанию (то есть по умолчанию = 0) в столбце внешнего ключа
  8. Одно из полей в отношении является частью комбинированного (составного) ключа и не имеет собственного индивидуального индекса. Несмотря на то, что поле имеет индекс как часть составного ключа, вы должны создать отдельный индекс только для этого ключевого поля, чтобы использовать его в ограничении.
  9. У вас есть синтаксическая ошибка в вашем ALTERзаявлении или вы неправильно ввели одно из имен полей в отношении
  10. Имя вашего внешнего ключа превышает максимальную длину в 64 символа.

Для получения дополнительных сведений см .: Ошибка MySQL № 1005 Не удается создать таблицу.

Питер Мортенсен
источник
4
проблема заключалась в том, что кодировки внешнего ключа не совпадали. Спасибо за ответ.
lamostreta
4
SHOW ENGINE INNODB STATUSкак упоминалось в этом вопросе, помогло мне диагностировать мою конкретную проблему (PEBCAK, в моем случае ...)
Hobo
1
блин, даже тот это первичный ключ. Вам необходимо создать индивидуальный индекс для этого ключа. спасибо, это решило мою проблему.
RSB
3
№4 была моя проблема - одна из таблиц была MyISAM, и сценарий пытался создать таблицу InnoDB. Я столкнулся с этой проблемой, когда пытался развернуть старую систему, которая изначально работала под управлением MySQL 5.0 или аналогичной версии, где механизмом хранения по умолчанию был MyISAM, а сценарии работали нормально. Моя текущая среда - 5.5, а хранилище по умолчанию - InnoDB. Добавление set names 'utf8', storage_engine=MYISAM;в начало скрипта решило проблему для меня. Спасибо @ user319198 и @Stefano за подробный ответ! : o)
Борис Червенков
1
У меня отсутствовал атрибут «без знака», как упоминалось в №1, спасибо!
Helvete
11

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

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

SET FOREIGN_KEY_CHECKS=0;

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

счастливый
источник
4

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

zahid9i
источник
4

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

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

раджаг
источник
2

У меня была аналогичная ошибка. Проблема заключалась в том, что дочерняя и родительская таблицы не имели одинаковой кодировки и сопоставления. Это можно исправить, добавив 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 означает, что отсутствует какой-то код.

user2258168
источник
2

Внешний ключ должен иметь тот же тип, что и первичный ключ, на который он ссылается. В примере типа «INT UNSIGNED NOT NULL» внешний ключ также должен иметь значение «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';
Яина Виллафаньес
источник
неподписанный был проблемой для меня. Спасибо!
Gabo
2

Код ошибки: 1005

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

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

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

Раджив Наир
источник
2

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

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

против

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

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

Чонгор Халмай
источник
1

MyISAM только что упоминался. Просто попробуйте добавить ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; в конце оператора, предполагая, что другие ваши таблицы были созданы с помощью MyISAM.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Дамир Олежар
источник
1

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

Ркавано
источник
1

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

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Абделла Алауи
источник
1

проверьте, что обе таблицы имеют одинаковую схему InnoDB MyISAM. Я сделал их все одинаково в моем случае InnoDB и работал

Брайан Санчес
источник
1

Моя проблема не была указана в списке, это было что-то настолько глупое ... Таблица с FKPK была составной, PKкоторая была объявлена ​​следующим образом: первичный ключ ( CNPJ, CEP) Я хотел, чтобы поле CEP FKнаходилось в другой таблице, и я был застрял в этой ошибке, мораль истории просто перевернула приведенный выше код для первичного ключа ( CEP, CNPJ), и это сработало. Получите чаевые своим друзьям.

Фагнер Виллис
источник