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 ]

3 голосов
/ 07 марта 2018

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

2 голосов
/ 23 августа 2017

Хотя другие ответы весьма полезны, просто хотел бы поделиться своим опытом.

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

Запрос на воссоздание (сгенерированный в phpMyAdmin) выглядел следующим образом:

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL,            /* No PRIMARY KEY index */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

... /* SOME DATA DUMP OPERATION */

ALTER TABLE `the_table`
  ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */
  ADD UNIQUE KEY `uk_acu_donor_name` (`name`);

Как вы можете заметить, индекс PRIMARY KEY был установлен после создания ( и вставки данных ), которое вызывало проблему.

Решение

Решением было добавить индекс PRIMARY KEY в запрос определения таблицы для id, на который ссылался как на внешний ключ, а также удалить его из части ALTER TABLE, где устанавливались индексы:

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL PRIMARY KEY,            /* <<== PRIMARY KEY INDEX ON CREATION */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1 голос
/ 09 октября 2017

Я использовал HeidiSQL и для решения этой проблемы мне пришлось создать индекс в ссылочной таблице со всеми ссылками на столбцы.

adding index to table Heidisql

1 голос
/ 13 сентября 2017

Проверьте движок таблиц, обе таблицы должны быть одинаковыми, что мне очень помогло.

1 голос
/ 03 августа 2017

Вам нужно проверить, чтобы оба были одинаковыми по всем своим свойствам, в том числе в "Сличении"

1 голос
/ 24 октября 2016

спасибо S Doerin:

"Только для завершения. Эта ошибка также может иметь место, если у вас есть внешний ключ с VARCHAR (..) и кодировка таблицы, на которую ссылаются, другаяиз таблицы, ссылающейся на него. Например, VARCHAR (50) в таблице Latin1 отличается от VARCHAR (50) в таблице UTF8. "

Я решил эту проблему, изменив тип символов вТаблица.у создания есть latin1 и правильный utf8.

добавить следующую строку.Набор символов по умолчанию = utf8;

1 голос
/ 18 октября 2016

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

Проблема в том, что ссылочный столбец не является первичным ключом.

Сделайте его первичным ключом, и проблема решена.

1 голос
/ 24 мая 2016

У меня была такая же проблема с Symfony 2.8.

Сначала я не получил, потому что не было подобных проблем с длиной внешних ключей и т. Д.

Наконец мне пришлось сделать следующее в папке проекта. (Перезагрузка сервера не помогла!)

app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result

1 голос
/ 23 января 2018

Я потерял несколько часов за это!

PK в одной таблице было utf8 в другой было utf8_unicode_ci!

1 голос
/ 13 января 2017

У меня были проблемы с использованием таблицы Alter для добавления внешнего ключа между двумя таблицами, и мне помогло убедиться, что каждый столбец, к которому я пытался добавить отношение внешнего ключа, был проиндексирован. Для этого в PHP myAdmin: Перейдите к таблице и нажмите на вкладку структуры. Нажмите опцию индексации, чтобы проиндексировать нужный столбец, как показано на скриншоте:

enter image description here

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

enter image description here

обратите внимание, как zip_code отображается в обеих таблицах.

...