Ошибка 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
1059   27  

27 ответов:

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

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

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

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

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

обновление:

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

проверить это.

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

SHOW ENGINE INNODB STATUS;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

удачи!

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

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

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
)

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

перед:

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)

);

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

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

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

для 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;

проверьте совместимость таблиц. Например, если одна таблица MyISAM, а другой InnoDB, вы можете иметь эту проблему.

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

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

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

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

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

для меня это были типы столбцов. Типа bigint != INT.

но тогда это все равно не сработало.

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

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

будьте в курсе использования обратных цитат тоже. У меня было в скрипте следующее утверждение

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

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

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

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

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

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

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

user таблица

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

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

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

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

удачи.

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

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

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

SET FOREIGN_KEY_CHECKS=0;

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

Comments

    Ничего не найдено.