MySQL 5.5 errno: 150 «Ограничение внешнего ключа сформировано неправильно» - PullRequest
0 голосов
/ 10 июля 2019

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

Моя 1-я таблица (пользователи):

enter image description here

Моя вторая таблица (колледжи):

enter image description here

Я пытаюсь изменить первую таблицу идобавить внешний ключ, который ссылается на id 2-й таблицы :

ALTER TABLE users
ADD CONSTRAINT FOREIGN KEY (collegelinkId)
REFERENCES databaseName.colleges (id);

, который завершается ошибкой (errno: 150 "Foreign key constraint is incorrectly formed").

Единственный параметр, который отличается между этими двумя таблицамиэто auto_increment.Однако я не могу добавить auto_increment в столбец collegelinkId таблицы моих пользователей, поскольку для его id уже установлено значение auto_increment.

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Мы ожидаем увидеть эту ошибку, если типы первичного и внешнего ключа не совпадают точно. Хотя оба значения имеют целое число с шириной 1, я предполагаю, что один из столбцов INT в отношении ключей не подписан, а другой - со знаком. Возможное исправление - сделать оба столбца без знака:

ALTER TABLE users MODIFY collegelinkId INT(10) UNSIGNED NOT NULL;
ALTER TABLE college MODIFY id INT(10) UNSIGNED NOT NULL;

Edit:

Я был не прав, о чем свидетельствуют ваши последние комментарии под моим ответом. Другая возможность состоит в том, что вы создали две таблицы, используя разные механизмы баз данных. Например, если вы создали users с использованием InnoDB, но college с использованием MyISAM, вы все равно можете получить эту ошибку. Чтобы исправить это, замените движок (и) на таблицах на тот же тип.

Обратите внимание, что еще одна возможность состоит в том, что эти два столбца имеют разные параметры сортировки. Но это действительно спорный вопрос, поскольку оба столбца числовые, а не текстовые.

0 голосов
/ 10 июля 2019
  • Убедитесь, что типы данных совпадают (кроме PRIMARY KEY).
  • Убедитесь, что обе таблицы ENGINE=InnoDB.

Даже после этого ошибка 150 все еще может возникать. 3 способа обойти это:

  • Отключить FK при создании таблиц, затем снова включить.
  • CREATE TABLEs без ФК, затем ALTER ... ADD ... FKs
  • Обязательно выполните CREATEs в правильном порядке.

Примечание: в INT(2) значение (2) не имеет значения. Все INTs 4 байта.

0 голосов
/ 10 июля 2019

Поскольку столбцы одного типа, стоит проверить тип двигателя, как предложено @Tim Biegeleisen.

Смена типа двигателя устранила проблему.

ALTER TABLE users
ENGINE=InnoDB;
...