mysql Неправильно сформировано ограничение внешнего ключа - PullRequest
131 голосов
/ 08 декабря 2011

У меня есть две таблицы, table1 - это родительская таблица со столбцом ID и table2 со столбцом IDFromTable1 (не фактическое имя), когда я ставлю FK на IDFromTable1 до IDв table1 я получаю ошибку Foreign key constraint is incorrectly formed error.Я хотел бы удалить запись таблицы 2, если table1 запись будет удалена.Спасибо за любую помощь

ALTER TABLE `table2`  
   ADD CONSTRAINT `FK1` 
      FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) 
      ON UPDATE CASCADE 
      ON DELETE CASCADE;

Дайте мне знать, нужна ли какая-либо другая информация.Я новичок в MySQL

Ответы [ 26 ]

302 голосов
/ 19 июня 2012

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

Столбец внешнего ключа был SMALLINT(5) UNSIGNED, а указанный столбец - INT(10) UNSIGNED. Как только я сделал их одинакового типа, создание внешнего ключа сработало отлично.

36 голосов
/ 14 декабря 2015

У меня была такая же проблема, когда родительская таблица была создана с использованием механизма MyISAM. Это глупая ошибка, которую я исправил:

ALTER TABLE parent_table ENGINE=InnoDB;
19 голосов
/ 09 июня 2016

убедитесь, что столбцы идентичны (одного типа), а если ссылочный столбец не равен primary_key, убедитесь, что он INDEXED.

17 голосов
/ 19 апреля 2013

Синтаксис для определения внешних ключей очень прост, но для всех, кто с этим сталкивается, тот факт, что внешние ключи должны быть «одного типа», применим даже к сопоставлению, а не только к типу данных и длине и подписанию битов.

Не то, чтобы вы смешивали параметры сортировки в вашей модели (не так ли?), Но если вы это сделаете, убедитесь, что поля первичного и внешнего ключей имеют одинаковый тип сопоставления в phpmyadmin или Heidi SQL или в любом другом используемом вами.

Надеюсь, это сэкономит вам четыре часа проб и ошибок, которые мне стоили.

10 голосов
/ 18 февраля 2016

Только для завершения.

Эта ошибка также может иметь место, если у вас есть внешний ключ с VARCHAR (..) и кодировка таблицы, на которую ссылаются, отличается от таблицы, ссылающейся на нее.

например, VARCHAR (50) в таблице Latin1 отличается от VARCHAR (50) в таблице UTF8.

10 голосов
/ 01 сентября 2016

У меня была такая же проблема, но я ее решил.

Просто убедитесь, что столбец 'ID' в 'table1' имеет UNIQUE index!

И, конечно, тип, длина столбцов 'ID' и 'IDFromTable1' в этих двух таблицах должны быть одинаковыми. Но вы уже знаете об этом.

8 голосов
/ 26 августа 2016

тексты ошибок mysql не очень помогают, в моем случае столбец имел ограничение «не ноль», поэтому «при удалении набора ноль» было запрещено

4 голосов
/ 05 февраля 2018

У меня была та же проблема, оба столбца были INT (11) NOT NULL, но я не смог создать внешний ключ. Мне пришлось отключить проверку внешних ключей, чтобы запустить его успешно:

SET FOREIGN_KEY_CHECKS=OFF;
ALTER TABLE ... ADD CONSTRAINT ...
SET FOREIGN_KEY_CHECKS=ON;

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 01 июня 2016

если все в порядке, просто добавьте ->unsigned(); в конце foregin key.

, если это не работает, проверьте тип данных обоих полей.они должны быть одинаковыми.

3 голосов
/ 01 мая 2018

(последнее отправленное) Даже если имя поля и тип данных совпадают, но параметры сортировки не совпадают, это также приведет к этой проблеме.

Например

TBL NAME |ТИП ДАННЫХ |COLLATION

ActivityID |INT | latin1_general_ci ActivityID |INT | utf8_general_ci

Попробуйте изменить его на

TBL NAME |ТИП ДАННЫХ |COLLATION

ActivityID |INT | latin1_general_ci ActivityID |INT | latin1_general_ci

....

Это сработало для меня.

...