Ограничение внешнего ключа не работает

#1215 — Невозможно добавить ограничения внешнего ключа

Хочу сделать внешним ключем поле uid таблицы PARIMATCH которое должно ссылаться на поле id таблицы User

Выдает ошибку
Ответ MySQL: Документация

#1215 — Невозможно добавить ограничения внешнего ключа

Удаление слов ON DELETE RESTRICT ON UPDATE RESTRICT из строки запроса ничего не дает

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ограничения внешнего ключа
есть 2 запроса на создание таблиц в БД. CREATE TABLE `books` ( `id` int(11) NOT NULL.

Ошибка ограничения внешнего ключа при создании новой записи
Здравствуйте! Имеется база (SQL Server): Нас интересуют таблицы Chaim(Заявка) и.

Создание внешнего ключа
Доброго времени суток. Как задать отношение между таблицами 1 к Многим?? То есть у меня есть 2.

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

Добавление внешнего ключа
Я заполняю основную таблицу данными, как мне добавить в нее внешние ключи? SqlCommand command7 =.

Добавление внешнего ключа
Всем Привет! можете помочь с одной штукой! как добавить внешний ключ в таблицу по нажатию Button?

Ограничение внешнего ключа
? вот к примеру у меня есть таблица ид_ ст почему я не могу туда поставить число 20

Добавления внешнего ключа
Здравствуйте. У меня имеется две таблицы, хочу к ним добавить внешний ключ. mysql> desc.

Считывание внешнего ключа
Есть две таблицы: «Group» и «UCHASTNIK». Group — родительская таблица, UCHASTNIK — дочерняя, связь.

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

Источник

ОШИБКА 1452: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется.

Я создал таблицы в MySQL Workbench, как показано ниже:

Таблица ORDRE:

Таблица PRODUKT:

и таблица ORDRELINJE:

поэтому, когда я пытаюсь вставить значения в ORDRELINJE таблицу, я получаю:

Код ошибки: 1452. Не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется ( srdjank . Ordrelinje , ОГРАНИЧЕНИЕ Ordrelinje_fk FOREIGN KEY ( Ordre ) REFERENCES Ordre ( OrdreID ))

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

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

Он отклонит любую операцию INSERT или UPDATE, которая пытается создать значение внешнего ключа в дочерней таблице, если в родительской таблице нет подходящего значения ключа кандидата.

Таким образом, ваша ошибка по Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails существу означает, что вы пытаетесь добавить строку в свою Ordrelinje таблицу, для которой в таблице нет соответствующей строки (OrderID) Ordre .

Вы должны сначала вставить строку в свою Ordre таблицу.

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

Чтобы вставить значение в Ordrelinje , вы сначала должны ввести значение в Ordre таблицу и использовать его OrdreID в Orderlinje таблице.

Или вы можете удалить ненулевое ограничение и вставить в него значение NULL.

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

Проблема связана с ограничением FOREIGN KEY. По умолчанию (SET FOREIGN_KEY_CHECKS = 1). Параметр FOREIGN_KEY_CHECKS указывает, следует ли проверять ограничения внешнего ключа для таблиц InnoDB. MySQL — УСТАНОВИТЬ FOREIGN_KEY_CHECKS

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

Выполните одну из этих строк перед запуском вашего запроса, тогда вы сможете успешно выполнить свой запрос. 🙂

1) Для сеанса (рекомендуется)

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

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

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

Теперь вы обычно можете выполнить один (или несколько) из следующих шагов, чтобы исправить данные.

  1. Основываясь на вашей «бизнес-логике», вам нужно будет обновить / сопоставить эти несоответствующие значения с существующими значениями в родительской таблице. Иногда вам также может потребоваться их установить null .
  2. Удалите эти строки с несоответствующими значениями.
  3. Добавьте новые строки в родительскую таблицу, соответствующие несоответствующим значениям в дочерней таблице.

Как только данные зафиксированы, мы можем применить ограничение внешнего ключа, используя ALTER TABLE синтаксис.

Источник

MySQL Не Может Добавить Ограничение Внешнего Ключа

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

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

это SQL, который я использую для создания таблиц, две оскорбительные таблицы Patient и Appointment .

19 ответов

, чтобы найти конкретную ошибку так:

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

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

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

  • двигатель надо же например InnoDB
  • тип должно быть таким же, и с такой же длиной. например, VARCHAR (20)
  • сортировка кодировка столбцов должна быть одинаковой. напр. utf8
    Watchout: даже если ваши таблицы имеют одинаковые параметры сортировки, столбцы все равно могут иметь разные.
  • уникальный — внешний ключ должен обратитесь к уникальному полю (обычно это первичный ключ) в справочной таблице.

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

надеюсь, что это помогает!

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

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

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

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

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

чтобы установить внешний ключ в таблице B, вы должны установить ключ в таблице A.

в таблице A: Индекс id ( id )

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

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

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

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

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

второй правый тип данных дает внешний ключ ?

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

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

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

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

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

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

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

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

Я получил ту же ошибку. Причиной в моем случае было:

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

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

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

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

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

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

иногда об этом забывают.

в моем случае была синтаксическая ошибка, которая не была явно уведомлена консолью MySQL при запуске запроса. Однако, SHOW ENGINE INNODB STATUS команды сообщал

мне пришлось оставить пробел между REFERENCES и role чтобы заставить его работать.

у меня была эта же проблема, затем я исправил имя двигателя как Innodb в родительской и дочерней таблицах и исправил имя ссылочного поля ВНЕШНИЙ КЛЮЧ ( c_id ) ссылки x9o_parent_table ( c_id )
затем он работает нормально, и таблицы установлены правильно. Это будет использовать полный для кого-то.

Источник

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

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

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

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

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

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

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

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

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

Обновить:

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

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

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

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

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

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

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

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

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

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

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

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

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

Я столкнулся с ловушкой «Ошибка 1215: невозможно добавить ограничение внешнего ключа» при использовании Laravel 4, особенно с JeffreyWay’s Laravel 4 Generators.

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

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

Перед:

Решение:

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

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

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

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

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

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

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

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

Не удается найти индекс в ссылочной таблице, в которой указанные столбцы отображаются как первые столбцы, или типы столбцов в таблице и ссылочной таблице не соответствуют ограничению. Обратите внимание, что тип внутренней памяти 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. На форвард инженера я получил следующую ошибку:

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

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

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

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

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

Источник

Читайте также:  Если ккт сломался как работать
Оцените статью