Код ошибки: 1005. Не удается создать таблицу '...' (номер ошибки: 150)

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

Я хочу создать внешний ключ от таблицы 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 

14 ответов

Решение

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

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

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

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

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

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

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

SET FOREIGN_KEY_CHECKS=0;

и это сработает.

Я знаю, что это немного поздний ответ, но я подумал, что это может быть полезно для кого-то.

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

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

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

Код ошибки: 1005

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

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

  1. Изменены имена внешних ключей (не работает)
  2. Уменьшена длина внешнего ключа
  3. Проверены типы данных (черт возьми, ничего плохого)
  4. Проверьте индексы
  5. Проверьте параметры сортировки (все хорошо, черт возьми снова)
  6. Усеченный стол, бесполезный
  7. Уронил стол и пересоздал
  8. Попытался увидеть, создается ли какая-либо круговая ссылка --- все хорошо

9. Наконец, я увидел, что у меня открыто два редактора. Один, который в PHPStorm (jetbrains) и другой MySQL верстак. Кажется, что инструментальные средства PHPStorm / SQL создают какую-то блокировку редактирования. Я закрыл PHPStorm просто чтобы проверить, была ли блокировка (это могло быть наоборот). Это решило мою проблему. Надеюсь, что это помогает кому-то, имеющему подобную проблему.

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

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

против

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

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

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

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

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

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

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

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 ;

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

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

Надеюсь, это поможет.

Также проверьте справочную таблицу! Вы можете по ошибке использовать другое поле в той же таблице

Другие вопросы по тегам