Невозможно добавить или обновить дочернюю строку

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

OrdreID INT
KundeID INT

ProduktID INT
ProduktFarge VARCHAR
Enhetpris INT

и таблица ORDRELINJE:

Ordre INT
Produkt INT

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

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

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

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

Вы получаете эту проверку ограничения, потому что 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для поиска всех этих строк в дочерней таблице, которая не имеет совпадающих значений в родительской таблице. Следующий запрос был бы полезен для получения этих несовпадающих строк:

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

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

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

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

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

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

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

Читайте также:  Код ошибки 8 на Ваз 2110 — Реле стартера

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

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

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

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

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

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

Невозможно добавить или обновить дочернюю строку

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

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

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

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

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

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

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;

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;

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_fk ИНОСТРАННЫЙ КЛЮЧ (Ordre) РЕКОМЕНДАЦИИ Ordre (OrdreID))

32
ответа

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

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

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

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

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

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

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

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

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

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

Теперь мы можем использовать 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

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

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

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

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

Читайте также:  Коды ошибок ВАЗ 2114, 2115, 2113

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

Невозможно добавить или обновить дочернюю строку

Он был отклонен с сообщением:

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

Я обнаружил, что изменение внешнего ключа обратно с не нулевого на нулевой ДО того, как я попытался сделать то, что, как я знал, было правильным кодом, заставило его работать. Помогло то, что я использовал Workbench Mysql. я должен был также установить
SET FOREIGN_KEY_CHECKS=0; а затем обратно к =1; после окончания.

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

В моем случае таблицы были идеально согласованы.

В любом случае я получал эту ошибку, потому что создал (случайно) более одного ограничения FK для одного и того же поля.

Я запускаю следующий запрос, чтобы показать все ключи:

SELECT *
FROM information_schema.table_constraints
WHERE constraint_schema = ‘my_db_name’

и я удалил неправильные с помощью следующего запроса:

ALTER TABLE my_table
DROP FOREIGN KEY wrong_fk_constraint;

Вы можете проверить это также, выполнив этот запрос:

SHOW CREATE TABLE my_table;

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

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

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

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

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

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

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

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

У меня такая же проблема, вот мой сценарий

я поставил пустой (”), где значение NULL, теперь это ” значение не совпадает с идентификатором родительской таблицы

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

Невозможно добавить или обновить дочернюю строку

Невозможно добавить или обновить дочернюю строку

На самом деле, я решил, что это сработало: «вставить в имя_базы_данных.имя_таблицы». И после того, как я пытаюсь добавить такие данные, как «вставить в имя базы данных», это сработало.

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

11 дек ’20 в 18:42

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

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

15 май ’21 в 15:57

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

Читайте также:  Код ошибки p0441 шкода суперб

В этом примере столбец b_id таблицы A не может соединиться со столбцом b_id таблицы B, потому что нет записи для 0. Чтобы решить эту проблему, добавьте/удалите/редактируйте содержимое таблиц, а не ограничения.

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

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

23 апр ’21 в 00:31

Вероятно, лучше ответить выше, но при работе в mysql workbench вам не нужно немедленно фиксировать транзакцию, вы можете одновременно фиксировать родительский и дочерний элементы. Поэтому настройте родителя с помощью sql или в графическом интерфейсе, добавьте дочерний элемент в графический интерфейс / sql и выполните фиксацию одновременно.

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

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

The MySQL ERROR 1452 happens when you try to execute a data manipulation query into a table that has one or more failing foreign key constraints.

The cause of this error is the values you’re trying to put into the table are not available in the referencing (parent) table.

Let’s see an example of this error with two MySQL tables.

Then, you create a Friends table to keep a record of people you know who lives in different cities.

In the code above, a CONSTRAINT named friends_ibfk_1 is created for the city_id column, referencing the id column in the Cities table.

This CONSTRAINT means that only values recoded in the id column can be inserted into the city_id column.

(To avoid confusion, I have omitted the id column from the Friends table. In real life, You may have an id column in both tables, but a FOREIGN KEY constraint will always refer to a different table.)

When I try to insert 5 as the value of the city_id column, I will trigger the error as shown below:

The response from MySQL:

ERROR 23000: Cannot add or update a child row:
a foreign key constraint fails
test_db.friends, CONSTRAINT friends_ibfk_1
FOREIGN KEY city_id REFERENCES cities id

As you can see, the error above even describes which constraint you are failing from the table.

Based on the Cities table data above, I can only insert numbers between 1 to 4 for the city_id column to make a valid INSERT statement.

— Query OK, 1 row affected (0.00 sec)

The same error will happen when I try to update the Friends row with a city_id value that’s not available.

— ERROR 1452 (23000): Cannot add or update a child row

There are two ways you can fix the ERROR 1452 in your MySQL database server:

  • You add the value into the referenced table
  • You disable the FOREIGN_KEY_CHECKS in your server

The first option is to add the value you need to the referenced table.

In the example above, I need to add the id value of 5 to the Cities table:

— Cities table:

Now I can insert a new row in the Friends table with the city_id value of 5:

Disabling the foreign key check

The second way you can fix the ERROR 1452 issue is to disable the FOREIGN_KEY_CHECKS variable in your MySQL server.

This variable causes MySQL to check any foreign key constraint added to your table(s) before inserting or updating.

You can disable the variable for the current session only or globally:

— set for the current session:

— set globally:

Now you can INSERT or UPDATE rows in your table without triggering a foreign key constraint fails:

— Query OK, 1 row affected (0.01 sec)

— Query OK, 1 row affected (0.00 sec)
— Rows matched: 1 Changed: 1 Warnings: 0

After you’re done with the manipulation query, you can set the FOREIGN_KEY_CHECKS active again by setting its value to 1:

But please be warned that turning off your FOREIGN_KEY_CHECKS variable will cause the city_id column to reference a NULL column in the cities table.

It may cause problems when you need to perform a JOIN query later.

Now you’ve learned the cause of ERROR 1452 and how to resolve this issue in your MySQL database server. Great work! 👍

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *