Ошибка MySQL 1215: не удается добавить ограничение внешнего ключа

Я пытаюсь перенаправить новую схему на мой сервер db, но я не могу понять, почему я получаю эту ошибку. Я попытался найти ответ здесь, но все, что я нашел, сказал, либо установил db-движок в 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 script завершено: операторы: 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

Ответ 1

Я предполагаю, что Clients.Case_Number и/или Staff.Emp_ID не являются точно такими же типами данных, как Clients_has_Staff.Clients_Case_Number и Clients_has_Staff.Staff_Emp_ID.

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

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

Ответ 2

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

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

Обновить:

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

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

Ответ 3

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

SHOW ENGINE INNODB STATUS;

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

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

Ответ 4

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

Например, когда вы пытаетесь связать PRIMARY KEYs из разных таблиц, обязательно укажите правильные параметры ON UPDATE и ON DELETE. Например:.

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

не будет летать, потому что PRIMARY KEYs (например, id) не может быть NULL.

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Существует ошибка, с которой я столкнулся с "Ошибка 1215: не могу добавить ограничение внешнего ключа" при использовании Laravel 4, особенно с генераторами JeffreyWay Laravel 4.

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

Ответ 8

Я получил ту же ошибку, пытаясь добавить fk. В моем случае проблема была вызвана таблицей FK PK, которая была помечена как unsigned.

Ответ 9

У меня такая же проблема.
Я решил это сделать так:

Я создал следующую строку в
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

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

Удачи!

Фелипе Терсио

Ответ 10

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

До:

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)

);

Я надеюсь, что это поможет;)

Ответ 11

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

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
)

Ответ 12

Это также происходит, когда тип столбцов не совпадает.

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

Ответ 13

Для MySQL (INNODB)... получите определения для столбцов, которые вы хотите связать

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;

Ответ 14

Проверьте совместимость таблиц. Например, если одна таблица MyISAM, а другая - InnoDB, может возникнуть эта проблема.

Ответ 15

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

По моему мнению, это не будет проблемой в отношении целостности данных, но кажется, что MySQL просто не поддерживает эту функцию (в 5.7).

Ответ 16

Когда эта ошибка возникает, потому что ссылочная таблица использует механизм MyISAM, этот ответ обеспечивает быстрый способ преобразования вашей базы данных, поэтому все таблицы моделей Django используют InnoDB: fooobar.com/questions/34659/...

Это команда управления Django, называемая convert_to_innodb.

Ответ 17

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

Ответ 18

Для меня это были типы столбцов. BigINT!= INT.

Но это все еще не сработало.

Итак, я проверил двигатели. Убедитесь, что Table1 = InnoDB и Table = InnoDB

Ответ 19

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

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

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

Ответ 20

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

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

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

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. Не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения

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

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

Когда я "перенаправляю" -ed диаграмму EER в новую схему, сценарий SQL запускался без проблем. Сравнивая сгенерированный SQL из попыток направить инженера, я обнаружил, что разница заключается в наборе символов и сопоставлении. Родительская таблица, utf8mb4 таблица и два столбца имели utf8mb4 символов utf8mb4 и utf8mb4_0900_ai_ci сортировки 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_general_ci. utf8mb4_0900_ai_ci работает только для MySQL Workbench 8.0 или выше. Я считаю, что одна из причин, по которой у меня возникли проблемы с набором символов и сопоставлением, связана с обновлением MySQL Workbench до 8.0 между ними. Вот ссылка, которая больше говорит об этом сопоставлении.

Ответ 21

Помните об использовании backquotes. Я имел в script следующее утверждение

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 дает несчастье подробности об этой ошибке...

Ответ 22

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

Ответ 23

при попытке сделать внешний ключ при использовании миграции laravel

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

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

    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

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

Чтобы решить эту проблему, необходимо изменить первичный ключ в таблице [colors table]

$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');

Ответ 24

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

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

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

Удачи.

Ответ 25

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

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

Ответ 26

В моем случае мне пришлось отключить проверки FOREIGN KEY как исходные таблицы не существовали.

SET FOREIGN_KEY_CHECKS=0;

Ответ 27

Для меня ошибка 1215 произошла, когда я импортировал файл дампа, созданный mysqldump, который создает таблицы в алфавитном порядке, что в моем случае вызывало внешние ключи для ссылочных таблиц, созданных позже в файле. (Перейдите на эту страницу, чтобы указать на нее: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/)

Поскольку mysqldump упорядочивает таблицы в алфавитном порядке, и я не хотел менять названия таблиц, я следовал инструкциям в ответе JeremyWeir на этой странице, в котором говорится, что set FOREIGN_KEY_CHECKS = 0; наверху файла дампа и поместите SET FOREIGN_KEY_CHECKS = 1; внизу файла дампа.

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

Ответ 28

Добавив еще одну причину к ответу @Explosion Pills выше:

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

Ответ 29

Даже у меня была та же проблема. И ошибка была с "неподписанным" маркером в таблице FK PK

Ответ 30

У меня была одна ошибка. Я просто перезапустил сервер MySQL и исправил проблему.