Ошибка MySQL 1215: невозможно добавить ограничение внешнего ключа

Я пытаюсь перенаправить мою новую схему на мой сервер БД, но я не могуне могу понять, почему я получаю эту ошибку. Я'Я пытался найти ответ здесь, но все, что яЯ нашел, что сказал либо установить двигатель БД на Innodb, либо убедиться, что ключи, которые яЯ пытаюсь использовать в качестве внешнего ключа первичные ключи в своих собственных таблицах. Я сделал обе эти вещи, если яЯ не ошибаюсь. Любая другая помощь, которую вы могли бы предложить, ребята?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

Выполнение SQL-скрипта завершено: операторы: 7 успешно выполнены, 1 не удалось

Вот SQL для родительских таблиц.

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
 Ike Walker06 июн. 2013 г., 20:08
Пожалуйста, опубликуйте схему для родительских таблиц:Clients а также .Staff
 Prometheus11 дек. 2016 г., 15:56
 Robert B10 июн. 2013 г., 16:03
мы добавили операторы SQL для таблиц Clients и Staff по запросу.
 Ike Walker06 июн. 2013 г., 20:22
@ Денис этоВозможно, это не дубликат, так как ОП говорит, что они проверили, что столбцы являются PK в родительских таблицах.
 Denis de Bernardy06 июн. 2013 г., 20:09

Ответы на вопрос(28)

например если столбец, на который вы ссылаетесь, равен UNSIGNED INT, а столбец, к которому вы обращаетесь, - INT, то вы получите эту ошибку.

FOREIGN KEY проверяет, так как исходные таблицы не существуют.

SET FOREIGN_KEY_CHECKS=0;

MyISAM а другойInnoDBВы можете иметь эту проблему.

ON DELETE SET NULL все столбцы, которые используются во внешнем ключе, должны разрешать нулевые значения. Кто-то еще узнал об этом вэтот вопрос.

Из моего понимания это неЭто не проблема целостности данных, но, похоже, MySQL просто неt поддерживает эту функцию (в 5.7).



Я решил это сделать так:

Я создал следующую строку в

primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Я нашел это решение после попытки импортировать таблицу в моем построителе схемы. Если это работает для вас, дайте мне знать!

Удачи!

Фелипе Теrcio

что у вас есть 2 или более одинаковых имен таблиц с одинаковыми именами внешних ключей. Это иногда случается с людьми, которые используют программное обеспечение для моделирования и проектирования, такое как Mysql Workbench, и позже генерируют скрипт из проекта.

которые вы хотите связать

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

сравнить и проверить оба определения столбцов

то же самое COLUMN_TYPE (длина), то же самое COLATION

может быть полезно играть как

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

по которым вы можете получить ошибку ограничения внешнего ключа:

Вы не используете InnoDB в качестве движка для всех таблиц.Вы пытаетесь сослаться на несуществующий ключ в целевой таблице. Убедитесь, что этоключ на другой таблице (это может быть первичный или уникальный ключ)Типы столбцов не одинаковы (за исключением того, что столбец в ссылочной таблице может иметь значение NULL).Если PK / FK является varchar, убедитесь, что сопоставление одинаково для обоих.

Обновить:

Одной из причин может быть также то, что столбец, который вы используете дляON DELETE SET NULL не определен как ноль. Поэтому убедитесь, что для столбца установлено значение по умолчанию null.

Проверьте это.

 Shi Ling10 окт. 2017 г., 02:04
На самом деле я столкнулся с проблемой, о которой упоминал @GrahamCharles, преобразовал мою схему сортировки из utf8 в utf8mb4 без преобразования существующих таблиц и не смог:Невозможно добавить FK из новых таблиц в более старые таблицы, потому что они находились в другом порядке сортировки. Это заняло целую вечность, чтобы отладить. Было бы здорово, если бы вы могли добавитьРазличное сопоставление между таблицами как одна из причин вашего ответа.
 Paul T. Rawkeen09 июн. 2016 г., 11:23
Также возможен сбойотсутствие индекса на целевом поле.
 Samus30 авг. 2017 г., 14:10
обновлялся до InnoDB, который исправил проблему
 Sebas16 июн. 2016 г., 17:21
здорово, 4-й пункт был моей проблемой. Это'Отчасти противно - но ям очень, очень рад MySQL потерпел крах за это
 Anand Rockzz18 февр. 2017 г., 07:08
# 5..заготовлен ли внешний стол? моя была той причиной :)
 alexglue18 нояб. 2015 г., 16:53
У меня есть еще одна причина =) `` `ON DELETE CASCADE ON UPDATE SET NULL:` `` Вы определили условие SET NULL, хотя некоторые столбцы определены как NOT NULL. Итак, я просто исправляю определение FK.
 Pravinraj Venkatachalam23 июн. 2017 г., 12:10
1 и 4 являются причинами в моем случае. Начинающие должны следить за этими моментами.
 Domi01 дек. 2014 г., 09:57
Отличный и простой ответ! Все ошибки отладки 1215 должны начинаться отсюда.Я добавил несколько более тонких случаев, чтобы высматривать, если ваша ошибка не вызвана каким-либо из этих пунктов.
 kmoser10 мая 2017 г., 03:42
Документация MySQL подробно описывает все ограничения внешнего ключа InnoDB:dev.mysql.com/doc/refman/5.7/en/....
 Randika Vishman21 июл. 2015 г., 16:52
Моей причиной была ваша первая "Различные БД Двигатели для двух таблиц, InnoDB и MyISAM "
 Graham Charles21 янв. 2014 г., 02:31
Я просто добавлю, что если FK находится в столбце символов, я думаю, что они должны быть из той же кодировки и сопоставления. (Или, возможно, 1-байтовые и 2-байтовые кодировки не совместимы.)
 Dominik Ehrenberg04 янв. 2017 г., 17:17
Относится к # 3: Это также может произойти, если у вас есть объединенный первичный ключ, и вы не ссылаетесь на все части первичного ключа

До:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Решение:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

Я надеюсь на это'с помощью;)

 DLight03 нояб. 2016 г., 15:06
Вы забыли пару запятых в вашем первом CREATE

как этот пример:

таблица пользователей

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

таблица цветов

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

иногда свойства не делалит работа

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

эта ошибка произошла из-за того, что внешний ключ (тип) в [таблица пользователей] отличается от первичного ключа (тип) в [таблица цветов]

Для решения этой проблемы следует изменить первичный ключ в [таблица цветов]

$table->tinyIncrements('id');

Когда вы используете первичный ключ$table->Increments('id');

вы должны использоватьInteger как внешний ключ

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Когда вы используете первичный ключ$table->tinyIncrements('id');

вы должны использоватьunsignedTinyInteger как внешний ключ

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Когда вы используете первичный ключ$table->smallIncrements('id');

вы должны использоватьunsignedSmallInteger как внешний ключ

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Когда вы используете первичный ключ$table->mediumIncrements('id');

вы должны использоватьunsignedMediumInteger как внешний ключ

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

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

Мне потребовалось около 4 часов, чтобы попробовать все остальное, кроме проверки этого.

Теперь все работает хорошо, и я могу вернуться к кодированию. :-)

 robsch06 мар. 2017 г., 10:53
@YazanJaber Я думаю, он имеет в видуэтот: InnoDB позволяет внешнему ключу ссылаться на любой столбец индекса или группу столбцов. Однако в ссылочной таблице должен быть индекс, в котором указанные столбцы перечислены как первые столбцы в том же порядке.
 Yazan Jaber22 февр. 2017 г., 12:06
Что ты имеешь в виду?

SET FOREIGN_KEY_CHECKS=0, затемSET FOREIGN_KEY_CHECKS=1 после. Когда я пошел, чтобы перезагрузить стол, я получилerror 1215, Проблема заключалась в том, что в базе данных была другая таблица с внешним ключом к таблице, которую я удалил и перезагружала. Часть процесса перезагрузки включала изменение типа данных для одного из полей, что делало внешний ключ из другой таблицы недействительным, вызывая тем самым запускerror 1215, Я решил проблему, отбросив и перезагрузив другую таблицу с новым типом данных для соответствующего поля.

Взрыв таблетки »ответ охватывает основы. Вы хотите, чтобы начать с этого. Тем не менее, есть и другие, более тонкие случаи, на которые стоит обратить внимание:

Например, когда вы пытаетесь связать ПЕРВИЧНЫЕ КЛЮЧИ разных таблиц, убедитесь, чтоON UPDATE а такжеON DELETE опции. Например.:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

победил'т, потому что ПЕРВИЧНЫЕ КЛЮЧИ (такие какid) Можно'т бытьNULL

Я уверен, что при добавлении такого рода ограничений возникают еще более тонкие проблемы, поэтому при обнаружении ошибок ограничений всегда следите за тем, чтобы ограничения и их последствия имели смысл в текущем контексте. Удачи с вашей ошибкой 1215!

 Martin Hennings16 окт. 2015 г., 09:26
Тот'причина, по которой я пришел сюда: я пытался создать внешний ключON DELETE SET NULL на колонке я хотел бытьNOT NULL, Предположим, вы можетеТорт и ешь тоже.
 Explosion Pills01 дек. 2014 г., 17:09
Вы также получите эту ошибку, если попытаетесь удалить внешний ключ, которого там нет :)
 Jonathan M13 янв. 2015 г., 19:03
Кроме того, из документов: MySQL требует индексов внешних ключей и ссылочных ключей, чтобы проверка внешних ключей могла быть быстрой и не требовала сканирования таблицы. В ссылочной таблице должен быть индекс, в котором столбцы внешнего ключа указаны в качестве первых столбцов.в том же порядке, Такой индекс создается в ссылочной таблице автоматически, если он не существует. Этот индекс может быть автоматически удален позже, если вы создадите другой индекс, который можно будет использовать для применения ограничения внешнего ключа. index_name, если дано, используется, как описано ранее.

невозможно добавить ограничение внешнего ключа " при использовании Laravel 4, особенно с JeffreyWay 'S Laravel 4 Генераторы.

В Laravel 4 вы можете использовать JeffreyWay 's Генераторы для создания файлов миграции для создания таблиц одна за другой, что означает, что каждый файл миграции генерирует одну таблицу. Вы должны знать о том факте, что каждый файл миграции генерируется с отметкой времени в имени файла, которая дает файлам порядок. Порядок генерации также является порядком операции миграции при запуске команды CLI Artisan "php artisan migrate ", Таким образом, если файл запрашивает ограничение внешнего ключа, ссылающееся на ключ, который будет, но еще не сгенерирован в последнем файле, возникает ошибка 1215. В таком случае вам нужно настроить порядок генерации файлов миграции. Создайте новые файлы в правильном порядке, скопируйте содержимое, затем удалите неупорядоченные старые файлы.

что уже было сказано, но в моем случае у меня было 2 базы данных (foo и bar). Сначала я создал Foo, и я нене понимаю, что ссылается на внешний ключ в bar.baz (который не былт еще создано). Когда я пытался создать bar.baz (без каких-либо внешних ключей), я продолжал получать эту ошибку. Посмотрев некоторое время, я нашел внешний ключ в foo.

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

дующее утверждение

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

но обратные кавычки в конце были ложными. Это должно было быть:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL, к сожалению, не дает подробностей об этой ошибке ...

я только что получил это! Это была смесь множества уже опубликованных ответов (innoDB, unsigned и т. Д.). Одна вещь, которую я не сделалХотя здесь видно: если ваш FK указывает на PK, убедитесь, что столбец-источник имеет значение, которое имеет смысл. Например, если PK является mediumint (8), убедитесь, что в исходном столбце также есть mediumint (8). Это было частью проблемы для меня.

SHOW TABLE STATUS Вы можете проверить информацию о таблицах, в том числе сопоставления.

Обе таблицы должны иметь одинаковое сопоставление.

Это'со мной случилось

 Juddling10 авг. 2018 г., 11:13
Это была проблема в моем случае - ошибка MySQL не помогает вообще!

что я ОЧЕНЬ опоздал на вечеринку, но я хочу выложить это здесь, чтобы это было в списке.

Как и все вышеперечисленные советы по обеспечению одинакового определения полей и типов таблиц с одинаковым сопоставлением, убедитесь, чтосделать ошибку новичка, пытаясь связать поля, где данные в поле CHILD еще не находятся в поле PARENT. Если у вас есть данные, которые находятся в поле CHILD, которые вы еще не ввели в поле PARENT, то это вызовет эту ошибку. Это'Обидно, что сообщение об ошибке не более полезно.

Если вы не уверены, сделайте резервную копию таблицы с внешним ключом, удалите все данные и попробуйте создать внешний ключ. Если успешно, то вам, что делать!

Удачи.

была вызвана таблицей FK 's PK, который был отмечен как неподписанный.

Решение Вопроса

Clients.Case_Number и / илиStaff.Emp_ID не точно такой же тип данных, какClients_has_Staff.Clients_Case_Number а также .Clients_has_Staff.Staff_Emp_ID

Возможно, столбцы в родительских таблицах есть?INT UNSIGNED

Они должны быть абсолютно одинакового типа данных в обеих таблицах.

 www.jensolsson.se26 мая 2015 г., 10:19
Также может быть, что набор символов отличается. Я скрыл эту проблему, когда в одном столбце был набор символов utf8, а в другом - latin1. Легко фиксируется с помощью ALTER TABLETable CHARACTER SET = utf8; и ALTER TABLEDevice ИЗМЕНИТЬ КОЛОННУID ID CHAR (36) CHARACTER SET 'utf8' НЕНУЛЕВОЙ;
 Robert B10 июн. 2013 г., 16:08
Благодарю. Это оказалось проблемой. Staff.Emp_ID был SMALLINT, а ссылочный столбец - INT. Иногда этомелочи ...
 Ike Walker27 мая 2015 г., 19:42
@ www.jensolsson.se Вы правы, если PK содержит один или несколько строковых столбцов, то они должны использовать один и тот же набор символова также сверка. В этом конкретном случае PK был INT, поэтому набор символов таблицы и / или столбцов не был релевантным.
 Felipe Baytelman25 сент. 2015 г., 02:17
Для меня проблема была INT против неподписанного INT !!!
 Rahul Sonone09 июл. 2016 г., 11:29
В моем случае я сделал один первичный ключ таблицы и unsigned, а внешний ключ другой таблицы не был помечен как unsigned, после исправления этой проблемы моя проблема решена.
 Pianoman01 февр. 2016 г., 15:20
Проверьте принятый ответ наstackoverflow.com/questions/6115612/... для простого способа конвертировать целые таблицы.
 chris29 авг. 2017 г., 11:07
int vs unsigned int действительно довольно часто является проблемой.
 Tushar Niras25 июн. 2017 г., 19:28
В моем случае набор символов был другим.
 ben_97928 апр. 2016 г., 03:15
Сличение было моей проблемой, latin1 vs utf8 (проверьте таблицу и столбец).
 wwkudu12 окт. 2014 г., 06:55
Tks. В моем случае я случайно нажал "ZEROFILL» на внешний ключ в дочерней таблице, что означало, что он не совпадает точно с родительской таблицейс колонкой.

Но тогда это еще нет работа.

Поэтому я проверил двигатели. Убедитесь, что Table1 = InnoDB и Table = InnoDB

Кс таблицей ПК

Я не могу найти эту ошибку

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

MySQL и исправил проблему.

 James11106 июл. 2015 г., 11:40
Это не решает проблему вообще.

ием типов столбцов, вы можете узнать больше информации об ошибке ключа mysql foriegn, введя команду

SHOW ENGINE INNODB STATUS;

Вы можете найти ошибку в верхней части напечатанного сообщения, например

Не удается найти индекс в ссылочной таблице, в которой указанные столбцы отображаются как первые столбцы, или типы столбцов в таблице и ссылочной таблице не соответствуют ограничению.

 alexglue18 нояб. 2015 г., 16:52
Это лучший ответ, я думаю, потому что он помогает в диагностике! Благодарю.
 ruwan80021 мар. 2017 г., 07:44
Делая это на PHPMyAdmin выигралт работа. сделать это в командной строке.
 C4d17 мар. 2016 г., 16:19
Как это должно работать? Выполнить оба запроса подряд?
 sureshd01 сент. 2016 г., 16:50
@ C4u, да, мы должны выполнить оба запроса подряд, указав сначала SHOW ENGINE INNODB STATUS, а затем другие запросы

что ссылочная таблица использует механизм MyISAM, этот ответ обеспечивает быстрый способ преобразования вашей базы данных, поэтому все таблицы моделей Django используют InnoDB:https://stackoverflow.com/a/15389961/2950621

Это'это команда управления Django с именем convert_to_innodb.

VARCHAR отношение внешнего ключа. Я провел последнюю неделю, пытаясь выяснить это в MySQL Workbench 8.0, и наконец смог исправить ошибку.

Короткий ответ: Набор символов и сопоставление схемы, таблицы, столбца, таблицы ссылок, столбца ссылок и любых других таблиц, которые ссылаются на родительскую таблицу, должны совпадать.

Длинный ответ: У меня в таблице был тип данных ENUM. Я изменил это наVARCHAR и я могу получить значения из справочной таблицы, чтобы я неНужно изменить родительскую таблицу, чтобы добавить дополнительные опции. Эти отношения с внешним ключом казались простыми, но я получил ошибку 1215.Эрвинд»ответ и следующеессылка на сайт предложил использовать

SHOW ENGINE INNODB STATUS;

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

Не удается найти индекс в ссылочной таблице, в которой указанные столбцы отображаются как первые столбцы, или типы столбцов в таблице и ссылочной таблице не соответствуют ограничению. Обратите внимание, что тип внутренней памяти ENUM и SET изменился в таблицах, созданных с помощью>= InnoDB-4.1.12, и на такие столбцы в старых таблицах нельзя ссылаться такими столбцами в новых таблицах. Пожалуйста, обратитесь кhttp://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html для правильного определения внешнего ключа.

После чего я использовалSET FOREIGN_KEY_CHECKS=0; как предложеноАрвин Бхарадвадж и ссылкаВот:

Это дало следующее сообщение об ошибке:

Код ошибки: 1822. Не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения

На данный момент яобратный инженерЯ смогла создать схему, и я смог установить отношение внешнего ключа на диаграмме EER. Напередовой инженер-ing, я получил следующую ошибку:

Ошибка 1452: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено

Когда я 'передовой инженер-в связи EER-диаграммы с новой схемой, SQL-скрипт выполнялся без проблем. Сравнивая сгенерированный SQL из попыток направить инженера, я обнаружил, что разница заключается в наборе символов и сопоставлении. Родительская таблица, дочерняя таблица и два столбца имелиutf8mb4 набор символов иutf8mb4_0900_ai_ci Однако в сопоставлении другой столбец в родительской таблице был указан с помощьюCHARACTER SET = utf8 , COLLATE = utf8_bin ; на другой дочерний стол.

Для всей схемы я изменил набор символов и параметры сортировки для всех таблиц и всех столбцов следующим образом:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Это наконец решило мою проблему с ошибкой 1215.

Примечание: Сопоставлениеutf8mb4_general_ci работает в MySQL Workbench 5.0 или новее. сличениеutf8mb4_0900_ai_ci работает только для MySQL Workbench 8.0 или выше. Я считаю, что одна из причин, по которой у меня возникли проблемы с набором символов и сопоставлением, связана с обновлением MySQL Workbench до 8.0 между ними. Вотссылка на сайт это говорит больше об этом сопоставлении.

Ваш ответ на вопрос