# 1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает

Когда я не хочу соединять две таблицы друг с другом, я получаю сообщение: # 1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает .... Я хочу подключить oauth_uid2 (первичный ключ) из таблицы facebook_users в таблицу ошибок с внешним ключом oauth_uid2. Но я всегда получаю это сообщение. Я уже очистил свои данные, но ничего не работает.Также в таблице users_facebook у меня есть 1 запись.

1452 - Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (_1 _._ 2_, CONSTRAINT bugs_ibfk_1 FOREIGN KEY (oauth_uid2) ССЫЛКИ users_facebook (oauth_uid2) НА УДАЛЕНИЕ КАСКАДА ПРИ КАСКАДЕ ОБНОВЛЕНИЯ)

таблица ошибок: FK = oauth_uid2, PK = bug_id

 #Name  Type    Collation   Attributes  Null    Default Extra   Action
     1  bug_id  int(30)         No  None    AUTO_INCREMENT    Change      Drop    Browse distinct values     Primary      Unique      Index  Spatial     Fulltext
     2  bugtitle    varchar(50) utf8_unicode_ci     No  None          Change      Drop    Browse distinct values      Primary     Unique      Index  Spatial     Fulltext
     3  bugdescription  varchar(500)    utf8_unicode_ci     No  None          Change      Drop    Browse distinct values      Primary     Unique      Index  Spatial     Fulltext
     4  oauth_uid2  int(30)         No  None          Change      Drop    Browse distinct values      Primary     Unique      Index  Spatial     Fulltext

Таблица users_facebook: PK = oauth_uid2

#   Name    Type    Collation   Attributes  Null    Default Extra   Action
     1  oauth_uid2  int(30)         No  None          Change      Drop    Browse distinct values     Primary      Unique      Index  Spatial     Fulltext
     2  email   varchar(70) utf8_unicode_ci     No  None          Change      Drop    Browse distinct values      Primary     Unique      Index  Spatial     Fulltext

person Glenda    schedule 16.05.2013    source источник
comment
Какой запрос или действие администратора вы пытаетесь выполнить?   -  person PM 77-1    schedule 16.05.2013


Ответы (2)


У вас уже есть ссылки на таблицы, откуда и возникает ошибка. Убедитесь, что у вас есть запись в users_facebook ПЕРЕД, когда вы пытаетесь вставить запись в bugs с тем же oauth_uid2, например

users_facebook has records with oauth_uid2 `10`, `20`, `30`

вы пытаетесь вставить запись в bugs с помощью

INSERT INTO bugs (oauth_uid2) VALUES (10) // works, there's a matching record in users_facebook
INSERT INTO bugs (oauth_uid2) VALUES (15) // fails, there's no user with that id.
person Marc B    schedule 16.05.2013

Если вы создаете резервную копию своей базы данных Magento с помощью других инструментов, таких как phpMyAdmin или Navicat, эти специальные операторы будут отсутствовать. При попытке запустить файл .sql вы получите следующие ошибки:

Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется

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

Чтобы восстановить резервную копию файла .sql без проверки ограничений, просто добавьте следующие операторы в начало файла .sql:

SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;
SET NAMES utf8;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';
SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0;

В конце файла добавьте операторы, необходимые для повторного включения проверки ограничений:

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION;
SET SQL_NOTES=@OLD_SQL_NOTES;

вы сможете это сделать.

person user3441015    schedule 12.05.2014
comment
Спасибо. Это спасло мне день! После остановки импорта из-за какой-либо ошибки sql вы получаете DUPLICATE ENTRY-error для каждого оператора INSERT, который был обработан ранее. Вот почему я заменил все инструкции INSERT на выражения REPLACE. Если заменять нечего, инструкция REPLACE ведет себя как инструкция INSERT. - person Sedat Kilinc; 22.01.2015