В MySql я получил ошибку 1215: не могу добавить внешний ключ. Зачем? [Дубликат]

Это правила. Хотя это не совсем так. Вы можете определить внутренние классы внутри вашего «основного» класса следующим образом:

  public class A {public class B {...}}  
217
задан Anthony Neace 20 March 2013 в 23:55
поделиться

20 ответов

Чтобы найти конкретную ошибку, запустите это:

SHOW ENGINE INNODB STATUS;

И посмотрите в разделе LATEST FOREIGN KEY ERROR.

Тип данных для дочернего столбца должен точно соответствовать родительскому столбцу , Например, поскольку medicalhistory.MedicalHistoryID является INT, Patient.MedicalHistory также должен быть INT, а не SMALLINT.

Кроме того, перед запуском запроса set foreign_key_checks=0 DDL, чтобы вы могли создавать таблицы в произвольном порядке, а не создавать все родительские таблицы перед соответствующими дочерними таблицами.

557
ответ дан rogerdpack 15 August 2018 в 23:51
поделиться
  • 1
    Спасибо, как несоответствие типа данных, так и foreign_key_checks исправили проблему! – joshuaegclark 20 March 2013 в 23:53
  • 2
    Был вызван другой сортировкой на таблицах для меня, один был UTF-8, а другой был latin1. – ug_ 23 July 2015 в 22:01
  • 3
    Я запускал set foreign_key_checks = 0, но я все еще получаю ошибку из-за произвольного порядка таблиц :( – JoeTidee 5 February 2016 в 13:21
  • 4
    Мои таблицы автоматически создавались с помощью механизма MyISAM! Спасибо, Айк. – Captain Hypertext 17 October 2016 в 19:17
  • 5
    Благодарю. Я пытался set null удалить, но столбец был not null. – Matt 5 March 2017 в 05:58
  • Двигатель должен быть таким же , например. InnoDB
  • Тип данных должен быть одинаков и одинаковой длины. например. VARCHAR (20)
  • Колонка Collation Columns должна быть одинаковой. например. utf8 Watchout: Даже если ваши таблицы имеют одинаковое значение Collation, столбцы все равно могут иметь разные.
  • Unique - внешний ключ должен ссылаться на уникальное поле (обычно первичный ключ) в справочной таблице.
47
ответ дан Andrew 15 August 2018 в 23:51
поделиться
  • 1
    Лучший ответ Когда-либо, попробовав почти все, оказалось, что я должен явно добавить unique в столбец ссылочной таблицы, даже если это Primary Key !! – Yahya 14 November 2017 в 12:18

Попробуйте использовать тот же тип ваших первичных ключей - int (11) - на внешних ключах - smallint (5) - также.

Надеюсь, это поможет!

15
ответ дан Felypp Oliveira 15 August 2018 в 23:51
поделиться
  • 1
    MySQL & GT; создать уникальный индекс index_bar_id на foos (bar_id); ... mysql & gt; alter table foos добавить ограничение index_bar_id внешний ключ (bar_id) reference bars (id); [Д0] sixarm.com/about/… – CookieCoder 17 December 2013 в 18:09

Я установил одно поле как «Без знака», а другое - нет. Как только я установил оба столбца в Unsigned, он работал.

103
ответ дан Nathan Tuggy 15 August 2018 в 23:51
поделиться
  • 1
    Установка для unsigned работала и на меня. – timothymarois 16 February 2017 в 15:35
  • 2
    Настройка неподписанного поля внешнего ключа работала для меня – manian 30 May 2017 в 14:24
  • 3
    Это работает и для меня. – Mustafa Olkun 25 April 2018 в 15:53

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

Иногда это забывается.

0
ответ дан AsifAli72090 15 August 2018 в 23:51
поделиться

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

  • Сначала проверяет, правильно ли указаны имена таблиц
  • Второй правый тип данных дает внешний ключ?
3
ответ дан Bhaskar Bhatt 15 August 2018 в 23:51
поделиться

Мое решение, может быть, немного смущает и рассказывает историю о том, почему вы должны иногда смотреть на то, что у вас есть перед вами, а не на эти сообщения :)

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

0
ответ дан DenLilleMand 15 August 2018 в 23:51
поделиться

Убедитесь, что кодировка символов и сопоставление для двух таблиц одинаковы.

В моем случае одна из таблиц использовала utf8, а другая - latin1.

У меня был другой случай, когда кодировка была одинаковой, но сортировка различна. Один utf8_general_ci другой utf8_unicode_ci

Вы можете запустить эту команду, чтобы установить кодировку и сопоставление для таблицы.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

10
ответ дан Goke Obasa 15 August 2018 в 23:51
поделиться

У меня была аналогичная ошибка при создании внешнего ключа в таблице Many to Many, где первичный ключ состоял из 2 внешних ключей и другого нормального столбца. Я исправил проблему, исправляя имя таблицы ссылок, т. Е. Компанию, как показано в скорректированном коде ниже:

create table company_life_cycle__history -- (M-M)
(
company_life_cycle_id tinyint unsigned not null,
Foreign Key (company_life_cycle_id) references company_life_cycle(id) ON DELETE    CASCADE ON UPDATE CASCADE,
company_id MEDIUMINT unsigned not null,
Foreign Key (company_id) references company(id) ON DELETE CASCADE ON UPDATE CASCADE,
activity_on date NOT NULL,
PRIMARY KEY pk_company_life_cycle_history (company_life_cycle_id, company_id,activity_on),
created_on datetime DEFAULT NULL,
updated_on datetime DEFAULT NULL,
created_by varchar(50) DEFAULT NULL,
updated_by varchar(50) DEFAULT NULL
);
0
ответ дан iltaf khalid 15 August 2018 в 23:51
поделиться

Проверьте подпись на обоих столбцах таблицы. Если столбец ссылочной таблицы SIGNED, столбец таблицы ссылок также должен быть SIGNED.

0
ответ дан katwekibs 15 August 2018 в 23:51
поделиться

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

Я использовал SequelPro для добавления ограничения, и он делал первичный ключ как неподписанный по умолчанию ,

2
ответ дан Learner 15 August 2018 в 23:51
поделиться

У меня такая же ошибка. Причина в моем случае:

  1. Я создал резервную копию базы данных через phpmyadmin, скопировав всю базу данных.
  2. Я создал новый db с тем же именем, старый db не выбрал его.
  3. Я начал сценарий SQL для создания обновленных таблиц и данных.
  4. Я получил ошибку. Также, когда я отключил foreign_key_checks. Несмотря на то, что база данных была полностью пуста.

Причина была: поскольку я использовал phpmyadmin для создания некоторых внешних ключей в переименованной базе данных - внешние ключи, созданные с префиксным именем базы данных, но имя базы данных префикс не был обновлен. Таким образом, в резервной копии db все еще есть ссылки на вновь созданный db.

0
ответ дан lsblsb 15 August 2018 в 23:51
поделиться

Имел подобную ошибку, но в моем случае мне не хватало, чтобы объявить pk как auto_increment.

На всякий случай это может быть полезно любому

0
ответ дан Luiz Rolim 15 August 2018 в 23:51
поделиться

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

Ссылка

: Если вы укажете действие SET NULL, убедитесь, что вы не объявили столбцы в дочерней таблице как NOT NULL. ( ref )

3
ответ дан Singh 15 August 2018 в 23:51
поделиться

У меня была эта же проблема, после чего я исправил имя Engine как Innodb как в родительских, так и в дочерних таблицах и скорректировал имя ссылочного поля FOREIGN KEY (c_id) ССЫЛКИ x9o_parent_table (c_id), тогда он отлично работает, и таблицы установлены правильно. Это будет полезно для кого-то.

-1
ответ дан subramanian 15 August 2018 в 23:51
поделиться

Чтобы установить FOREIGN KEY в таблице B, вы должны установить KEY в таблице A.

В таблице A: INDEX id (id)

И затем в таблице B,

CONSTRAINT `FK_id` FOREIGN KEY (`id`) REFERENCES `table-A` (`id`)
5
ответ дан user1623521 15 August 2018 в 23:51
поделиться
  • 1
    я точно не знаю, что вы говорите, но я обнаружил, что мой синтаксис неверен. Я делал: alter table aircraft add constraint fk_somehting_unique external key (operator_id) ссылается на организацию организации, но должен был сделать: alter table добавить ограничение на добавление fk_somehting_unique внешний ключ (operator_id) ссылки организация (id) ; – Michael Coxon 16 June 2018 в 21:13
  • 2
    Спасибо!!!!! После нескольких часов попыток исправить мою проблему, это было исправление! – TheMrkt 4 August 2018 в 06:58
  • 3
    – Renil Babu 26 August 2018 в 16:28

Убедитесь, что обе таблицы находятся в формате InnoDB. Даже если он находится в формате MyISAM, тогда ограничение внешнего ключа не будет работать.

Кроме того, другое дело, что оба поля должны быть одного типа. Если один из них INT, то другой должен также быть INT. Если один из VARCHAR, другой должен также быть VARCHAR и т. Д.

4
ответ дан Vijay Srinivas 15 August 2018 в 23:51
поделиться

У меня была аналогичная ошибка с двумя внешними ключами для разных таблиц, но с одинаковыми именами клавиш! Я переименовал ключи, и ошибка исчезла)

0
ответ дан Олег Всильдеревьев 15 August 2018 в 23:51
поделиться
0
ответ дан Channaveer Hakari 29 October 2018 в 06:23
поделиться
0
ответ дан vicke4 29 October 2018 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: