I’m having a bit of a strange problem. I’m trying to add a foreign key to one table that references another, but it is failing for some reason. With my limited knowledge of MySQL, the only thing that could possibly be suspect is that there is a foreign key on a different table referencing the one I am trying to reference.
I’ve done a SHOW CREATE TABLE
query on both tables, sourcecodes_tags
is the table with the foreign key, sourcecodes
is the referenced table.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
This is the code that generates the error:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
6 мая 2013 г.
Фикс «Mysql error 1452 — Cannot add or update a child row: a foreign key constraint fails» при миграции в Doctrine 1.2
6 мая 2013 г.
В ситуациях, когда необходимо совершать действия над таблицей, которая уже содержит в себе какие-либо данные, может возникнуть неприятная ошибка: «Mysql error 1452 — Cannot add or update a child row: a foreign key constraint fails«.
Возникает она вследствие того, что мы пытаемся изменить существующую запись таким образом, что нарушается целостность.
Например, присвоение полю ключа, который не существует в родительской таблице. Или создание нового внешнего ключа для поля, которое не должно быть NULL, в таблице, которая уже содержит некоторое количество записей. Последняя проблема у меня и возникла. Необходимо было решение, и оно было найдено.
Решение простое как пять копеек. Нам необходимо избавиться от NULL-значений в поле, на которое навешивается внешний ключ.
Предположим, что вы уже отредактировали схему соответствующим образом и она имеет примерно следующее содержание:
Human: columns: name: { type: string(255), notnull: true } human_status_id: { type: integer, notnull: true } relations: HumanStatus: local: human_status_id foreign: id onDelete: CASCADE HumanStatus: columns: name: { type: string, notnull: true }
После успешной генерации миграций должны появиться два файла миграций: один будет содержать создание таблиц, а вторая создание связей между ними. Именно второй файл мы и будем редактировать. Нам это никто не запрещает.
Итак, как я уже сказал, нам необходимо избавиться от NULL-значений. Для этого мы поправим вторую миграцию примерно таким образом:
public function up() { $conn = Doctrine_Manager::getInstance()->getCurrentConnection(); $oHumanStatus = new HumanStatus(); $oHumanStatus->setName('Temp'); $oHumanStatus->save(); Doctrine_Query::create() ->update() ->from('Human') ->set('human_status_id', $oHumanStatus->getId()) ->execute(); $this->createForeignKey('human', 'human_human_status_id_human_status_id', array( 'name' => 'human_human_status_id_human_status_id', 'local' => 'human_status_id', 'foreign' => 'id', 'foreignTable' => 'human_status', 'onUpdate' => '', 'onDelete' => 'CASCADE', )); $this->addIndex('human', 'human_human_status_id', array( 'fields' => array( 0 => 'human_status_id', ), )); }
Думаю, основная идея понятна. Если нет нужды в создании новой записи в таблице HumanStatus, можно поискать уже существующие. Все зависит от вашей ситуации.
Далее накатываем обе миграции. Все должно пройти успешно. Если нет — читайте мануалы дальше. Возможно, это не ваш случай.
P.S. Не оставляйте die() в up() или down() методах миграции. Иначе она не накатится.
Автор: Артур Минимулин ⚫ 6 мая 2013 г. ⚫ Тэги: php, Symfony, Doctrine, MySQL
Wondering how to resolve MySQL Error 1452? We can help you.
At Bobcares, we offer solutions for every query, big and small, as a part of our Microsoft SQL Server Support Services.
Let’s take a look at how our Support Team is ready to help customers with MySQL Error 1452.
How to resolve MySQL Error 1452?
Usually, this error occurs when we try to execute a data manipulation query into a table that has one or more failing foreign key constraints.
What causes MySQL Error 1452?
The cause of this error is the values we are trying to put into the table are not available in the referencing (parent) table.
When a column of a table is referenced from another table, it is called Foreign Key.
For example, consider a table City that contains the name of a city and its ID.
Also, there is another table Buddies to keep a record of people that we know who lives in different cities.
We have to reference the id column of the City table as the FOREIGN KEY of the city_id column in the friends table as follows:
CREATE TABLE friends (
firstName varchar(255) NOT NULL,
city_id int unsigned NOT NULL,
PRIMARY KEY (firstName),
CONSTRAINT friends_ibfk_1
FOREIGN KEY (city_id) REFERENCES City (id)
)
In the code above, a CONSTRAINT named buddies_ibfk_1 is created for the city_id column, referencing the id column in the City table.
This CONSTRAINT means that only values in the id column can be inserted into the city_id column.
If we try to insert a value that is not present in id column into the city_id column, it will trigger the error as shown below:
ERROR 1452 (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 city (id))
How to resolve it?
Today, let us see the steps followed by our Support Techs to resolve it:
There are two ways to fix the ERROR 1452 in MySQL database server:
1. Firstly, add the value into the referenced table
2. Then, disable the FOREIGN_KEY_CHECKS in the server
1. Add the value into the referenced table
The first option is to add the value we need to the referenced table.
In the example above, add the required id value to the City table.
Now we can insert a new row in the Buddies table with the city_id value that we inserted.
Disabling the foreign key check
2. Disable the FOREIGN_KEY_CHECKS variable in MySQL server.
We can check whether the variable is active or not by running the following query:
SHOW GLOBAL VARIABLES LIKE ‘FOREIGN_KEY_CHECKS’;
— +——————–+——-+ — | Variable_name | Value | — +——————–+——-+ — | foreign_key_checks | ON | — +——————–+——-+
This variable causes MySQL to check any foreign key constraint added to our table(s) before inserting or updating.
We can disable the variable for the current session only or globally:
— set for the current session:
SET FOREIGN_KEY_CHECKS=0;
— set globally:
SET GLOBAL FOREIGN_KEY_CHECKS=0;
Now we can INSERT or UPDATE rows in our table without triggering a foreign key constraint fails.
After we are done with the manipulation query, we can set the FOREIGN_KEY_CHECKS active again by setting its value to 1:
— set for the current session:
SET FOREIGN_KEY_CHECKS=1;
— set globally:
SET GLOBAL FOREIGN_KEY_CHECKS=1;
Turning off FOREIGN_KEY_CHECKS variable will cause the city_id column to reference a NULL column in the City table.
It may cause problems when we need to perform a JOIN query later.
[Looking for a solution to another query? We are just a click away.]
Conclusion
To sum up, our skilled Support Engineers at Bobcares demonstrated how to resolve MySQL Error 1452.
PREVENT YOUR SERVER FROM CRASHING!
Never again lose customers to poor server speed! Let us help you.
Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.
GET STARTED
У меня немного странная проблема. Я пытаюсь добавить внешний ключ к одной таблице, которая ссылается на другую, но по какой-то причине она не работает. Имея мои ограниченные знания MySQL, единственное, что может быть подозрительным, это наличие внешнего ключа в другой таблице, ссылающейся на ту, которую я пытаюсь ссылаться.
Вот изображение моих связей в таблице, сгенерированное с помощью phpMyAdmin:
Отношения
Я выполнил запрос SHOW CREATE TABLE
для обеих таблиц, sourcecodes_tags
— это таблица с внешним ключом, sourcecodes
— ссылочная таблица.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Было бы здорово, если бы кто-нибудь мог рассказать мне, что здесь происходит, у меня не было формального обучения или чего-то еще с MySQL:)
Спасибо.
Изменить: Это код, который генерирует ошибку:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
Я создал таблицы в MySQL Workbench, как показано ниже:
Таблица ORDRE:
Таблица PRODUKT:
а также Таблица ORDRELINJE:
поэтому, когда я пытаюсь вставить значения в таблицу , я получаю:
Код ошибки: 1452. Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (., ОГРАНИЧЕНИЕ ИНОСТРАННЫЙ КЛЮЧ () ССЫЛКИ ())
Я видел другие сообщения по этой теме, но безуспешно. Я что-то контролирую или есть идеи, что делать?
- 3 возможных дубликата ошибки Mysql 1452 — невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется
Взято из использования ограничений FOREIGN KEY
Взаимосвязи внешнего ключа включают родительскую таблицу, которая содержит центральные значения данных, и дочернюю таблицу с идентичными значениями, указывающими на ее родительскую. Предложение FOREIGN KEY указано в дочерней таблице.
Он отклонит любую операцию INSERT или UPDATE, которая пытается создать значение внешнего ключа в дочерней таблице, если в родительской таблице нет подходящего значения ключа кандидата.
Таким образом, ваша ошибка по существу означает, что вы пытаетесь добавить строку в таблицу , для которой в таблице нет соответствующей строки (OrderID).
Сначала необходимо вставить строку в таблицу .
- Или мы можем удалить внешний ключ, а затем добавить внешний ключ после вставки данных?
- @VamsiPavanMahesh, НЕТ, потому что даже если ты это сделаешь; создание вашего внешнего ключа не удастся с такой же ошибкой, так как будет несоответствие ключевых данных.
- 4 Проще говоря, если у детей определены идентификаторы родителей, эти родители должны существовать. И я подумал, что у меня неправильный синтаксис … Это мне очень помогло. Спасибо!
- 2 А как насчет необязательных отношений?
Вы получаете эту проверку ограничения, потому что таблица не имеет ссылки , указанной в команде вставки.
Чтобы вставить значение в , вам сначала нужно ввести значение в таблицу и использовать тот же в таблице .
Или вы можете удалить ненулевое ограничение и вставить в него значение NULL.
Вы должны удалить данные в дочерней таблице, которая не имеет соответствующего значения внешнего ключа для первичного ключа родительской таблицы. Или удалите все данные из дочерней таблицы, а затем вставьте новые данные, имеющие то же значение внешнего ключа, что и первичный ключ в родительской таблице. . Это должно сработать. Здесь также видео на YouTube
- 1 Это правильно, перед вставкой данных в сводную таблицу (имеющую ограничения CASCADE) вы должны вставить данные в родительские таблицы. например 1-я таблица — разрешения; 2-я таблица — роли; 3-я таблица — permission_role; Итак, первая вставка в таблицу разрешений, вторая вставка в таблицу ролей и, наконец, вставка в таблицу permission_role.
Проблема связана с ограничением FOREIGN KEY. По умолчанию (SET FOREIGN_KEY_CHECKS = 1). Параметр FOREIGN_KEY_CHECKS указывает, следует ли проверять ограничения внешнего ключа для таблиц InnoDB. MySQL — УСТАНОВИТЬ FOREIGN_KEY_CHECKS
Мы можем отключить проверку внешнего ключа перед запуском запроса. Отключить внешний ключ.
Выполните одну из этих строк перед запуском вашего запроса, тогда вы сможете успешно выполнить свой запрос.
1) Для сеанса (рекомендуется)
2) Глобально
Эта ошибка обычно возникает из-за того, что у нас есть некоторые значения в ссылка поле дочерней таблицы, которых нет в упомянутый / кандидат поле родительской таблицы.
Иногда мы можем получить эту ошибку, когда применяем ограничения внешнего ключа к существующей таблице (таблицам), уже имея данные в них. В некоторых других ответах предлагается полностью удалить данные из дочерней таблицы, а затем применить ограничение. Однако это не вариант, когда у нас уже есть рабочие / производственные данные в дочерней таблице. В большинстве сценариев нам потребуется обновить данные в дочерней таблице. (вместо их удаления).
Теперь мы можем использовать , чтобы найти все те строки в дочерней таблице, которые не имеют совпадающих значений в родительской таблице. Следующий запрос был бы полезен для получения этих несовпадающих строк:
Теперь вы обычно можете выполнить один (или несколько) из следующих шагов, чтобы исправить данные.
- Основываясь на вашей «бизнес-логике», вам нужно будет обновить / сопоставить эти несоответствующие значения с существующими значениями в родительской таблице. Иногда вам может потребоваться также установить их .
- Удалите эти строки с несоответствующими значениями.
- Добавьте новые строки в родительскую таблицу, соответствующие несоответствующим значениям в дочерней таблице.
Как только данные зафиксированы, мы можем применить ограничение внешнего ключа, используя синтаксис .
- Я удаляю все данные из таблицы, а затем добавляю внешний ключ, он был добавлен, спасибо
в таблице внешнего ключа есть значение, которое не принадлежит в таблице первичного ключа, которая будет связана, поэтому вы должны сначала удалить все данные / настроить значение своей таблицы внешнего ключа в соответствии со значением, которое находится в вашем первичном ключе
У меня возникла эта проблема, хотя в моей родительской таблице были все значения, на которые я ссылался в моей дочерней таблице. Проблема заключалась в том, что я не мог добавить несколько дочерних ссылок к одному внешнему ключу. Другими словами, если бы у меня было пять строк данных, ссылающихся на один и тот же внешний ключ, MySQL позволял мне загружать только первую строку и выдавал мне ошибку 1452.
Что сработало для меня, так это набрать код «SET GLOBAL FOREIGN_KEY_CHECKS = 0». После этого я закрыл MySQL, а затем перезапустил его, и я смог загрузить все свои данные без ошибок. Затем я набрал «SET GLOBAL FOREIGN_KEY_CHECKS = 1», чтобы вернуть систему в нормальное состояние, хотя я не совсем уверен, что делает FOREIGN_KEY_CHECKS. Надеюсь это поможет!
- Разве это не то, что уже было предложено в ответе @ Mr-Faizan? Если нет, то объясните, что добавляет ваш ответ.
Это можно исправить, вставив сначала соответствующие записи в родительскую таблицу, а затем мы можем вставить записи в соответствующий столбец дочерней таблицы. Также проверьте тип данных и размер столбца. Он должен быть таким же, как столбец родительской таблицы, даже механизм и сопоставление также должны быть такими же. ПОПРОБУЙ ЭТО! Вот как я решил свою. Поправьте меня, если ошибаюсь.
Это помогло мне после прочтения ответов @ Mr-Faizan и других.
Снимите флажок «Включить проверку внешнего ключа».
в phpMyAdmin и нажмите запрос. Я не знаю о WorkBench, но другие ответы могут вам помочь.
Ваша таблица связана с таблицей с использованием ограничения внешнего ключа , согласно которому столбец таблицы должен соответствовать любому столбцу таблицы .
Теперь, что здесь происходит, когда вы вставляете новую строку в таблицу , в соответствии с ограничением fk она проверяет таблицу , присутствует ли , присутствует ли или нет, и поскольку он не соответствует ни одному OrderId, компилятор жалуется на внешний ключ нарушение. Это причина, по которой вы получаете эту ошибку.
Внешний ключ — это первичный ключ другой таблицы, который вы используете в любой таблице для связи между ними. Этот ключ связан ограничением внешнего ключа, которое вы указываете при создании таблицы. Любая операция с данными не должна нарушать это ограничение. Нарушение этого ограничения может привести к подобным ошибкам.
Надеюсь, я прояснил это.
При вставке значений атрибутов внешнего ключа сначала проверьте тип атрибутов, а также значение атрибута первичного ключа в родительском отношении. Если значения в родительском отношении совпадают, вы можете легко вставить / обновить значения дочерних атрибутов.
вы должны добавить данные из REFERENCES KEY в PRIMARY TABLE к FOREIGN KEY в CHILD TABLE
это означает, что не добавляйте случайные данные во внешний ключ ، Просто используйте данные из первичного ключа, которые доступны
описание данных во внешнем ключе
вы должны вставить по крайней мере один raw в каждую таблицу (те, на которые вы хотите, чтобы внешние ключи указывали), тогда вы можете вставить или обновить значения внешних ключей
втисну это сюда: в моем случае я пытался создать лайк для сообщения, которое не существует; при фиксации в базе данных возникла ошибка. Решение заключалось в том, чтобы сначала создать сообщение, а затем оно понравится. Насколько я понимаю, если post_id должен быть сохранен в таблице лайков, ему нужно сначала проверить таблицу сообщений, чтобы убедиться в существовании. Я счел, что так будет лучше, потому что мне так логичнее …
Когда вы используете внешний ключ, твой порядок столбцов должен быть таким же за вставка.
Например, если вы добавляете в Таблица 1 от Таблица 2 затем из Таблица 2 порядок должен быть таким же и не как , где — внешний ключ в Таблица 2 из Таблица 1.
Проблема возникает из-за того, что вы устанавливаете внешний ключ в дочерней таблице после вставки некоторых данных в дочернюю таблицу.
Попробуйте удалить все данные из дочерней таблицы, затем установите внешний ключ, а затем добавьте / вставьте данные в таблицу, это будет работать.
проверьте нет. записи в родительской таблице, которая соответствует дочерней таблице, а также первичный ключ, должен совпадать со ссылкой на внешний ключ. У меня это работает.
Сначала разрешите NULL в родительской таблице и установите значения по умолчанию на NULL. Затем создайте отношение внешнего ключа. Впоследствии вы можете обновить значения, чтобы они соответствовали соответственно
В моем случае таблицы были идеально согласованы.
В любом случае я получал эту ошибку, потому что создал (случайно) более одного ограничения FK для одного и того же поля.
Я запускаю следующий запрос, чтобы показать все ключи:
и я удалил неправильные с помощью следующего запроса:
Вы можете проверить это также, выполнив этот запрос:
У меня такая же проблема. Я создавал отношения в существующих таблицах, но имел разные значения столбцов, которые предполагались / предполагались связанными. Например, у меня была таблица , в которой был столбец со строками . Затем у меня была другая дочерняя таблица со столбцом со строками . Затем я запускаю команду MySQl
Он был отклонен с сообщением:
Я экспортировал данные из таблицы ORDERS, затем удалил из нее все данные, снова запустил команду, на этот раз она сработала, затем повторно вставила данные с соответствующими из таблицы USERS.
Его 100% рабочий …
ОШИБКА 1452: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает …. если возникает этот тип ошибки: то в первую очередь перейдите к этой таблице и проверьте настройку>, если Engine: InnoDB, затем измените ее на MyISAM
(и удалить ссылки внешнее ограничение)
0 / 0 / 0 Регистрация: 07.05.2015 Сообщений: 3 |
|
1 |
|
MySQL 07.05.2015, 14:14. Показов 29666. Ответов 9
При добавлении данных выдает эту ошибку:
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,177 |
|
07.05.2015, 15:20 |
2 |
При добавлении данных выдает эту ошибку Судя по сообщению ты хочешь добавить в дочернюю таблицу строку с несуществующим ключом FK (т.е. такого значения нет в родительской таблице). Так что смотри конкретные поля во вставляемой строке.
0 |
0 / 0 / 0 Регистрация: 07.05.2015 Сообщений: 3 |
|
07.05.2015, 16:35 [ТС] |
3 |
Обе таблицы имеют поля id которые являются ключом, имеют индекс поля user_id по которым и происходит связь.
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,177 |
|
07.05.2015, 17:06 |
4 |
Обе таблицы имеют поля id которые являются ключом Покажи DDL таблиц, а также пример своего INSERT
0 |
0 / 0 / 0 Регистрация: 07.05.2015 Сообщений: 3 |
|
07.05.2015, 20:20 [ТС] |
5 |
таблицы создавал и связывал в phpmyadmin, а как там сам запрос показать на создание таблиц я хз.
0 |
Модератор 4204 / 3044 / 581 Регистрация: 21.01.2011 Сообщений: 13,177 |
|
08.05.2015, 09:59 |
6 |
все работало до того как связал таблицы Есть подозрение, что ты их неправильно связал. Поэтому без DDL никак. А насчет INSERT — имеет смысл его показывать только с конкретными данными, имена переменных не говорят о том, что в них содержится.
0 |
0 / 0 / 0 Регистрация: 31.05.2015 Сообщений: 77 |
|
26.06.2015, 15:21 |
7 |
извините что встреваю, но у меня похожая проблема со связыванием не можете сказать что мне делать? я просто новичок в этом((( #1452 — Cannot add or update a child row: a foreign key constraint fails (`catalogue`.`#sql-c68_1f`, CONSTRAINT `#sql-c68_1f_ibfk_1` FOREIGN KEY (`id_category`) REFERENCES `category` (`id`))
0 |
-14 / 3 / 0 Регистрация: 27.07.2018 Сообщений: 97 |
|
20.01.2019, 16:25 |
8 |
Надо внимательно проверить связываемое поле. Тип данных, беззнаковое — должна стоя ть галочка, поле по умолчанию под вопросом но значения в строках не должно быть «0» id со значением ноль не бывает.
0 |
4 / 4 / 0 Регистрация: 17.08.2016 Сообщений: 56 |
|
13.04.2019, 00:47 |
9 |
В дизайнере PHPMyAdmin, при создании связи, надо убедиться, что вы нажали сначала на родителя, а потом на детёныша, чтобы связь была от отца к сыну. Ну по крайней мере у меня всё починилось
0 |
0 / 0 / 0 Регистрация: 11.02.2020 Сообщений: 1 |
|
13.02.2020, 08:33 |
10 |
При ошибке #1452 может помочь установка связи между таблицами, а именно тип RESTRICT
0 |
I have created tables in MySQL Workbench as shown below :
ORDRE table:
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 table:
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;
and ORDRELINJE table:
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;
so when I try to insert values into ORDRELINJE
table i get:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (
srdjank
.Ordrelinje
, CONSTRAINTOrdrelinje_fk
FOREIGN KEY (Ordre
) REFERENCESOrdre
(OrdreID
))
I’ve seen the other posts on this topic, but no luck.
Am I overseeing something or any idea what to do?
I’m having a bit of a strange problem. I’m trying to add a foreign key to one table that references another, but it is failing for some reason. With my limited knowledge of MySQL, the only thing that could possibly be suspect is that there is a foreign key on a different table referencing the one I am trying to reference.
I’ve done a SHOW CREATE TABLE
query on both tables, sourcecodes_tags
is the table with the foreign key, sourcecodes
is the referenced table.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
This is the code that generates the error:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
I’m having a bit of a strange problem. I’m trying to add a foreign key to one table that references another, but it is failing for some reason. With my limited knowledge of MySQL, the only thing that could possibly be suspect is that there is a foreign key on a different table referencing the one I am trying to reference.
I’ve done a SHOW CREATE TABLE
query on both tables, sourcecodes_tags
is the table with the foreign key, sourcecodes
is the referenced table.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
This is the code that generates the error:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
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.
Suppose you have a Cities
table that contains the following data:
+----+------------+
| id | city_name |
+----+------------+
| 1 | York |
| 2 | Manchester |
| 3 | London |
| 4 | Edinburgh |
+----+------------+
Then, you create a Friends
table to keep a record of people you know who lives in different cities.
You reference the id
column of the Cities
table as the FOREIGN KEY
of the city_id
column in the Friends
table as follows:
CREATE TABLE `Friends` (
`firstName` varchar(255) NOT NULL,
`city_id` int unsigned NOT NULL,
PRIMARY KEY (`firstName`),
CONSTRAINT `friends_ibfk_1`
FOREIGN KEY (`city_id`) REFERENCES `Cities` (`id`)
)
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:
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('John', 5);
The response from MySQL:
ERROR 1452 (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.
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('John', 1);
-- 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.
Take a look at the following example:
UPDATE `Friends` SET city_id = 5 WHERE `firstName` = 'John';
-- 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:
INSERT INTO `Cities` VALUES (5, 'Liverpool');
-- Cities table:
+----+------------+
| id | city_name |
+----+------------+
| 1 | York |
| 2 | Manchester |
| 3 | London |
| 4 | Edinburgh |
| 5 | Liverpool |
+----+------------+
Now I can insert a new row in the Friends
table with the city_id
value of 5
:
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('Susan', 5);
-- Query OK, 1 row affected (0.00 sec)
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.
You can check whether the variable is active or not by running the following query:
SHOW GLOBAL VARIABLES LIKE 'FOREIGN_KEY_CHECKS';
-- +--------------------+-------+
-- | Variable_name | Value |
-- +--------------------+-------+
-- | foreign_key_checks | ON |
-- +--------------------+-------+
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 FOREIGN_KEY_CHECKS=0;
-- set globally:
SET GLOBAL FOREIGN_KEY_CHECKS=0;
Now you can INSERT
or UPDATE
rows in your table without triggering a foreign key constraint fails
:
INSERT INTO `Friends` (`firstName`, `city_id`) VALUES ('Natalia', 8);
-- Query OK, 1 row affected (0.01 sec)
UPDATE `Friends` SET city_id = 17 WHERE `firstName` = 'John';
-- 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
:
-- set for the current session:
SET FOREIGN_KEY_CHECKS=1;
-- set globally:
SET GLOBAL FOREIGN_KEY_CHECKS=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! 👍
Я создал таблицы в 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 для поиска всех этих строк в дочерней таблице, которая не имеет совпадающих значений в родительской таблице. Следующий запрос был бы полезен для получения этих несовпадающих строк:
Теперь вы обычно можете выполнить один (или несколько) из следующих шагов, чтобы исправить данные.
- Основываясь на вашей «бизнес-логике», вам нужно будет обновить / сопоставить эти несоответствующие значения с существующими значениями в родительской таблице. Иногда вам также может потребоваться их установить null .
- Удалите эти строки с несоответствующими значениями.
- Добавьте новые строки в родительскую таблицу, соответствующие несоответствующим значениям в дочерней таблице.
Как только данные зафиксированы, мы можем применить ограничение внешнего ключа, используя ALTER TABLE синтаксис.
Источник