2012-01-26 1 views
92

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

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

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

Можете ли вы показать схему для 'metal_kod' таблицы ... что поле в этой таблице следует ссылка на внешний ключ? – ManseUK

ответ

239

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

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

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

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

для получения более подробной информации см: MySQL Error Number 1005 Can’t create table

+0

спасибо за ответ. Как я уже упоминал в своем вопросе, я уже проверил большинство ваших предложений. Я также попробую других. – lamostreta

+4

проблема заключалась в том, что кодировки внешних ключей не совпадали. Спасибо за ответ. – lamostreta

+4

'SHOW ENGINE INNODB STATUS', упомянутый в [этот вопрос] (http://stackoverflow.com/questions/2799021/mysql-error-1005-hy000-cant-create-table-foo-sql-12c-4-errno -150) помогли мне диагностировать мою конкретную проблему (PEBCAK, в моем случае ...) – Hobo

3

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

+0

Спасибо за это! Сэкономил несколько минут. –

3

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

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

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

1

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

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

Я надеюсь, что помогает.

11

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

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

SET FOREIGN_KEY_CHECKS=0; 

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

+0

Я куплю вам пиво –

0

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 ; 
0

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

2

Код ошибки: 1005

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

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

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

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

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 означает, что есть недостающий код.

0

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

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

против

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

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

1

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

неподписанная проблема для меня. Благодаря! –