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


134

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

Таблица ORDRE:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

Таблица PRODUKT:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

и таблица ORDRELINJE:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

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

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

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


Ответы:


174

Взято из использования ограничений FOREIGN KEY

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

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

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

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


Или мы можем удалить внешний ключ, а затем добавить внешний ключ после вставки данных?
Вамси Паван Махеш

@VamsiPavanMahesh, НЕТ, потому что даже если ты это сделаешь; создание вашего внешнего ключа не удастся с такой же ошибкой, так как будет несоответствие ключевых данных.
Рахул

4
Проще говоря, если у детей определены родительские идентификаторы, эти родители должны существовать. И я подумал, что у меня неправильный синтаксис ... Это мне очень помогло. Спасибо!
Вт

2
А как насчет необязательных отношений?
Хамед Хамеди

40

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

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

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


30

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


1
Это правильно, перед вставкой данных в сводную таблицу (имеющую ограничения CASCADE) вы должны вставить данные в родительские таблицы. например 1-я таблица - разрешения; 2-я таблица - роли; 3-я таблица - permission_role; Итак, первая вставка в таблицу разрешений, вторая вставка в таблицу ролей и, наконец, вставка в таблицу permission_role.
Дипак Панвар,

25

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

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

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

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

SET FOREIGN_KEY_CHECKS=0;

2) Глобально

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

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

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

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

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

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

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

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


Я удаляю все данные из таблицы, а затем добавляю внешний ключ, он был добавлен, спасибо
Сумит Кумар Гупта

4

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


3

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

Для меня сработало набрать код «SET GLOBAL FOREIGN_KEY_CHECKS = 0». После этого я закрыл MySQL, а затем перезапустил его, и я смог загрузить все свои данные без ошибок. Затем я набрал «SET GLOBAL FOREIGN_KEY_CHECKS = 1», чтобы вернуть систему в нормальное состояние, хотя я не совсем уверен, что делает FOREIGN_KEY_CHECKS. Надеюсь это поможет!


Разве это не то, что уже было предложено в ответе @ Mr-Faizan? Если нет, то объясните, что добавляет ваш ответ.
Адриан Моул

2

Это можно исправить, вставив сначала соответствующие записи в родительскую таблицу, а затем мы можем вставить записи в соответствующий столбец дочерней таблицы. Также проверьте тип данных и размер столбца. Он должен быть таким же, как столбец родительской таблицы, даже механизм и сопоставление также должны быть такими же. ПОПРОБУЙ ЭТО! Вот как я решил свою. Поправьте меня, если ошибаюсь.


1

Ваша ORDRELINJEтаблица связана сORDER таблицей с использованием ограничения внешнего ключа, в constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)соответствии с которым Ordre int NOT NULL,столбец таблицы ORDRELINJEдолжен соответствовать любому Ordre int NOT NULL,столбцу ORDERтаблицы.

Теперь, что здесь происходит, когда вы вставляете новую строку в ORDRELINJEтаблицу, в соответствии с ограничением fk Ordrelinje_fkона проверяет ORDERтаблицу OrdreID, присутствует ли она или нет, и поскольку она не соответствует ни одному OrderId, компилятор жалуется на нарушение внешнего ключа. Это причина, по которой вы получаете эту ошибку.

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

Надеюсь, я прояснил это.


1

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


1

вы должны добавить данные из REFERENCES KEY в PRIMARY TABLE к FOREIGN KEY в CHILD TABLE,
это означает, что не добавляйте случайные данные во внешний ключ ، просто используйте данные из первичного ключа, которые доступны

описание данных во внешнем ключе


1

Это помогло мне после прочтения ответов @ Mr-Faizan и других.

Снимите флажок "Включить проверку внешнего ключа".

в phpMyAdmin и нажмите запрос. Я не знаю о WorkBench, но другие ответы могут вам помочь.


0

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


0

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


0

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

Например, если вы добавляете (userid, password)в table1 из table2 затем из table2 порядке должны быть одинаковыми (userid, password)и не так, как (password,userid) , где useridнаходится внешний ключ в table2 из table1 .


0

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

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


0

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


-4

Его 100% рабочий ...

ОШИБКА 1452: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает .... если возникает этот тип ошибки: то в первую очередь перейдите к этой таблице и проверьте параметр>, если Engine: InnoDB, затем измените его на MyISAM

(и удалить ссылки внешнее ограничение)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.