Код помилки: 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таблиці ... на яке поле в цій таблиці має бути посилання на зовнішній ключ?
Мансе

Відповіді:


271

Код помилки: 1005 - у вашому коді неправильна посилання первинного ключа

Зазвичай це пов'язано з посиланням зовнішнього ключа, яке не існує. Можливо, у вас є помилка друку, або перевірте, чи має бути те саме, чи є невідповідність поля. Іноземні ключі поля повинні точно відповідати визначенням.

Деякі відомі причини можуть бути:

  1. Тип та / або розмір двох ключових полів не відповідають точно. Наприклад, якщо це INT(10)ключове поле, повинно бути INT(10)також, а ні, INT(11)або TINYINT. Ви можете підтвердити розмір поля за допомогою того, SHOW CREATE TABLEщо браузер запитів іноді візуально відображатиметься лише 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

Дуже часто це трапляється, коли зовнішній ключ і контрольний ключ не мають однакового типу або однакової довжини.


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 означає, що є якийсь код, який відсутній.


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

проблема без мене була безпідписаною. Дякую!
Габо

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) і він спрацював. Підкажіть своїх друзів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.