Ошибка 1452 mysql как исправить

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

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! 👍

0 / 0 / 0

Регистрация: 07.05.2015

Сообщений: 3

1

MySQL

07.05.2015, 14:14. Показов 28526. Ответов 9


При добавлении данных выдает эту ошибку:
#1452 — Cannot add or update a child row: a foreign key constraint fails (`baza`.`personal_info`, CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `resume` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
Подскажите как исправить!)

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Модератор

4190 / 3031 / 576

Регистрация: 21.01.2011

Сообщений: 13,111

07.05.2015, 15:20

2

Цитата
Сообщение от falsh
Посмотреть сообщение

При добавлении данных выдает эту ошибку

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



0



0 / 0 / 0

Регистрация: 07.05.2015

Сообщений: 3

07.05.2015, 16:35

 [ТС]

3

Обе таблицы имеют поля id которые являются ключом, имеют индекс поля user_id по которым и происходит связь.



0



Модератор

4190 / 3031 / 576

Регистрация: 21.01.2011

Сообщений: 13,111

07.05.2015, 17:06

4

Цитата
Сообщение от falsh
Посмотреть сообщение

Обе таблицы имеют поля id которые являются ключом

Покажи DDL таблиц, а также пример своего INSERT



0



0 / 0 / 0

Регистрация: 07.05.2015

Сообщений: 3

07.05.2015, 20:20

 [ТС]

5

таблицы создавал и связывал в phpmyadmin, а как там сам запрос показать на создание таблиц я хз.
Вот сам запрос в php, все работало до того как связал таблицы)
$sql = «INSERT INTO personal_info(name, surname, flooring, city, telefon, citizenship, children)
VALUES(‘».$name.»‘, ‘».$surname.»‘, ‘».$flooring.»‘, ‘».$city.»‘, ‘».$telefon.»‘, ‘».$citizenship.»‘, ‘».$children.»‘)»;



0



Модератор

4190 / 3031 / 576

Регистрация: 21.01.2011

Сообщений: 13,111

08.05.2015, 09:59

6

Цитата
Сообщение от falsh
Посмотреть сообщение

все работало до того как связал таблицы

Есть подозрение, что ты их неправильно связал. Поэтому без 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

Сообщений: 86

20.01.2019, 16:25

8

Надо внимательно проверить связываемое поле. Тип данных, беззнаковое — должна стоя ть галочка, поле по умолчанию под вопросом но значения в строках не должно быть «0» id со значением ноль не бывает.



0



4 / 4 / 0

Регистрация: 17.08.2016

Сообщений: 54

13.04.2019, 00:47

9

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



0



0 / 0 / 0

Регистрация: 11.02.2020

Сообщений: 1

13.02.2020, 08:33

10

При ошибке #1452 может помочь установка связи между таблицами, а именно тип RESTRICT
В phpMyAdmin можно менять тип связи через таблица->структура->связи



0



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

Понравилась статья? Поделить с друзьями:
  • Ошибка 1452 mysql workbench
  • Ошибка 1451 на форд эскейп
  • Ошибка 1451 sql
  • Ошибка 1451 mysql
  • Ошибка 1450 недостаточно системных ресурсов для завершения операции