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

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

Я хочу создать внешний ключ от таблицы 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 в обеих таблицах (charset и collation), но не смог найти решение этой проблемы. Как я могу решить эту проблему?

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

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

Ответ 1

Код ошибки: 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 1005 Не удается создать таблицу

Ответ 2

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

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

SET FOREIGN_KEY_CHECKS=0;

и он будет работать.

Ответ 3

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

Ответ 4

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

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

Ответ 5

Код ошибки: 1005

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

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

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

Ответ 6

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

Ответ 7

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

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

против

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

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

Ответ 8

Внешний ключ должен иметь тот же тип, что и первичный ключ, на который он ссылается. Для примера имеет тип "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';

Ответ 9

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

ALTER TABLE 'Window' ADD CONSTRAINT 'Windows_ibfk_1' FOREIGN KEY ('WallId') REFERENCES 'Wall' ('id') ON DELETE CASCADE ON UPDATE CASCADE;

Ответ 10

MyISAM только что упоминалось. Просто попробуйте добавить ДВИГАТЕЛЬ = 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 ;

Ответ 11

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

Ответ 12

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