Подтвердить что ты не робот

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

Я создал таблицы в 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, CONSTRAINT Ordrelinje_fk ИНОСТРАННЫЙ КЛЮЧ (Ordre) ССЫЛКИ Ordre (OrdreID) )

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

4b9b3361

Ответ 1

Взято из Использование ограничений 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.

Ответ 2

Вы получаете эту проверку ограничений, поскольку таблица ordre не имеет идентификатора ссылочного заказа, указанного в команде вставки.

Чтобы вставить значение в ordrelinje, сначала нужно ввести значение в таблицу ordre и использовать тот же ordreID в таблице orderlinje.

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

Ответ 3

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

Ответ 4

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

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

Теперь мы можем использовать 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. Основываясь на вашей "бизнес-логике", вам нужно будет обновить/сопоставить эти unmatching значения с существующими значениями в родительской таблице. Иногда вам может понадобиться также установить их значение null.
  2. Удалите эти строки, имеющие значения unmatching.
  3. Добавьте новые строки в родительскую таблицу, соответствующие значениям unmatching в дочерней таблице.

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

Ответ 5

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

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

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

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

SET FOREIGN_KEY_CHECKS=0;

2) Глобально

SET GLOBAL FOREIGN_KEY_CHECKS=0;

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

Вы должны добавить данные из КЛЮЧЕВОГО КЛЮЧА в ПЕРВИЧНОЙ ТАБЛИЦЕ к ИНОСТРАННОМУ КЛЮЧУ в ДЕТСКОМ СТОЛЕ
это значит не добавлять случайные данные во внешний ключ, просто использовать данные из первичного ключа, который доступен

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

Ответ 10

Ваша таблица 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, компилятор жалуется на нарушение внешнего ключа. Именно по этой причине вы получаете эту ошибку.

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

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

Ответ 11

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

Ответ 12

Я часто отбрасываю эту команду foreign_key командой

ALTER TABLE <table_name> DROP FOREIGN KEY <fk_foreign_key>;

он работает для меня.

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