В MySQL у меня есть 2 таблицы, одна таблица ciudadano
связана с другой examen
; экзамен имеет поле examen.Cedula_Ciudadano
, которое исходит от ciudadano.Cedula
.
Как мне обновить запись от гражданина и одновременно обновить ее на экзамене? Почему он отправляет мне ошибку:
error 1452. Cannot add or update a child row: a foreign key constraint fails
Код следующий:
UPDATE
examen e
JOIN ciudadano c
on e.Cedula_Ciudadano=c.Cedula
SET
e.Cedula_Ciudadano='s',
c.Cedula='s'
WHERE
c.Cedula='222-301000-11023'
Как правило, не рекомендуется использовать в качестве первичного ключа поле, которое не фиксируется с течением времени. Например, в таблице
Ciudadano
лучше было бы создать поле с автоинкрементом следующим образом:id_ciudadano INT NOT NULL AUTO_INCREMENT
и добавить идентификатор как еще одно значение. Таким образом,id_ciudadano
он никогда не изменится и может быть идеальным первичным ключом, без необходимости реализовывать какие-либо хитрости, описанные в этом или других ответах.Возможное решение
Ошибка
Cannot add or update a child row: a foreign key constraint fails
появляется, когда:Из того, что вы говорите, я предполагаю, что вы пытаетесь изменить удостоверение личности гражданина. Скорее всего, указанный гражданин уже зарегистрировал экзамен в соответствующей таблице и по этой причине выдает ошибку.
Вы можете сделать две вещи:
CONSTRAINT
вашему внешнему ключу.Удалить упомянутые зависимости
Предположим, у нас есть гражданин с идентификатором
1234
, и указанный пользователь имеет два экзамена в таблицеexamen
. Все, что вам нужно сделать, это запустить эту команду:Если вы хотите сохранить экзамены указанного гражданина, сохраните данные экзамена и вставьте их позже с новым идентификатором. Если вы делаете это из сценария, это простая задача. Если вы делаете это из службы по расписанию, большинство языков предоставляют функции, упрощающие задачи вставки.
Добавьте спецификации в CONSTRAINT
При создании внешнего ключа в MySQL по умолчанию добавляются следующие спецификации:
Все, что вам нужно сделать, это изменить эти настройки, чтобы при изменении идентификатора гражданина также менялись справки на экзаменах. Отрицательный момент : это можно сделать только во время создания таблицы, например:
Когда таблица была создана и в ней уже есть данные, ее необходимо удалить и создать заново ( дополнительную информацию см. в этом ответе ) .
У меня была такая же ошибка, и я смог исправить ее с помощью...
вы также можете использовать...
но первый вариант безопаснее, так как активен только на время сеанса
Источники: ОШИБКА 1452: не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа