MySQL загрузка из дампа: ОШИБКА 1452 (23000) в строке 13: не удается добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется - PullRequest
5 голосов
/ 01 апреля 2011

Я сбросил базу данных mysql, используя mysqldump, с помощью следующей команды:

mysqldump --no-create-db --no-create-info --compact --single-transaction --complete-insert --extended-insert=FALSE --flush-logs -uroot -ppassword databasename > databasename.db.data.dump.sql

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

  1. ТОЛЬКО дампданные
  2. Не создавать никаких операторов DDL, таких как CREATE TABLE и т. д.

У меня есть скрипт, который генерирует базу данных CLEAN (т.е. базу данных со структурами данных - таблицами, индексами и т. д., ноНЕТ данных).

Я хочу импортировать данные, выгруженные с помощью приведенной выше команды, в базу данных CLEAN.

Я пытаюсь импортировать сброшенные данные (т.е. восстановить данные) в CLEANбазы данных, введя следующую команду:

mysql -h hostname -u user --password=password databasename < filename

Когда я запускаю эту команду, я получаю следующую ошибку:

ERROR 1452 (23000) at line 13: Cannot add or update a child row: a foreign key constraint fails (`tpwsdb`.`sf_guard_group_permission`, CONSTRAINT `sf_guard_group_permission_FK_2` FOREIGN KEY (`permission_id`) REFERENCES `sf_guard_permission` (`id`) ON DELETE CASCADE)

Строка 13 в файле выгруженных данных:

INSERT INTO `sf_guard_group_permission` (`group_id`, `permission_id`) VALUES (1,1);

схема для sf_guard_group_permission:

mysql> describe sf_guard_group_permission;
+---------------+---------+------+-----+---------+-------+
| Field         | Type    | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| group_id      | int(11) | NO   | PRI | NULL    |       |
| permission_id | int(11) | NO   | PRI | NULL    |       |
+---------------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

Permission_id - это FK в таблице sf_guard_permission.Из-за ошибки кажется, что mysql пытается заполнить таблицу зависимостями (так сказать, дочерней таблицей), ДО заполнения родительской таблицы.

После проверки содержимого выгруженного файла я вижу, что действительно операторы INSERT для зависимой (дочерней) таблицы PRECEDE и для родительской таблицы - что явно нарушает ограничения ссылочной целостности для таблицы.

Эта ошибка, по-видимому, вызвана порядком, в котором операторы INSERT создаются mysqldump, который, как ни странно, не обращает внимания на RI

Есть ли в любом случае принудительный порядок, в которомmysqldump создает операторы INSERT - т.е. чтобы таблицы, являющиеся FK в других таблицах, появлялись перед таблицами, на которые они ссылаются?

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

Кто-то, должно быть, сталкивался с этой проблемой прежде, чем использовать mysqldump - как решить эту проблему?

1 Ответ

11 голосов
/ 01 апреля 2011

Каждый раз, когда вы импортируете файл дампа в пустые данные с внешними ключами, вы должны установить следующую переменную:

SET FOREIGN_KEY_CHECKS = 0;

Таким образом, если дочерняя строка вставляется перед родительской строкой, MySQL не выдаст ошибку.

Эта переменная устанавливается по умолчанию в mysqldump, но вы отключаете ее, используя флаг --compact.

У вас есть две возможности исправить это:

1) снова запустить дамп без --compact:

mysqldump --no-create-db --no-create-info --single-transaction --complete-insert --extended-insert=FALSE --flush-logs -uroot -ppassword databasename > databasename.db.data.dump.sql

2) Импортируйте имеющийся у вас дамп, но сначала отключите проверку внешнего ключа:

mysql -h hostname -u user --password=password databasename
SET FOREIGN_KEY_CHECKS = 0;
\. databasename.db.data.dump.sql
...