powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядок создания таблиц с внешними ключами в mysqldump.
13 сообщений из 13, страница 1 из 1
Порядок создания таблиц с внешними ключами в mysqldump.
    #39775661
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую коллег! Вот такая проблема обнаружилась.

При восстановлении БД из дампа получаем ошибку:
Код: plaintext
Can't create table ... (errno: 150 "Foreign key constraint is incorrectly formed")
т.е. ругается на то что пытаемся создать таблицу с внешним ключом, на ещё не существующую другую таблицу.
Просмотр файла дампа показал, что действительно таблица с внешним ключом создаётся раньше чем таблица, на которую она ссылается.

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

p.s. Версия сервера: MariaDB 10.0.
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39775719
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкинпочему утилита mysqldump не следит за тем чтобы таблицы создавались в правильном порядке?Потому что восстановление ВСЕГДА проводится при отключении подсистемы контроля целостности.
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39775735
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ааа!! перед восстановлением надо так прописать:
Код: plaintext
set foreign_key_checks=0;
??

Тогда странно, почему этот оператор в дамп-файл не записывается по умолчанию?
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39775750
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получилось! перед восстановлением сделал так:
Код: plaintext
set foreign_key_checks=0;

ошибка сохранилась.
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39775797
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
Код: plaintext
Can't create table ... (errno: 150 "Foreign key constraint is incorrectly formed")
т.е. ругается на то что пытаемся создать таблицу с внешним ключом, на ещё не существующую другую таблицу
Мне не с руки проверять, но нет, мне не кажется что ваш вывод по такой ошибке справедлив.
Скорее парсеру не нравится само выражение. Дамп снимался с базы этой же версии? Покажите строку из дампа на которой падает.
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39775844
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,
Падает здесь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DROP TABLE IF EXISTS `dinner_client_l_gift`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `dinner_client_l_gift` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `dlg_id` int(10) unsigned DEFAULT NULL,
  `clientId` int(10) unsigned DEFAULT NULL,
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated` datetime DEFAULT NULL,
  `expiry` datetime DEFAULT NULL,
  `activated` tinyint(3) unsigned NOT NULL,
  `ord_id` bigint(20) unsigned DEFAULT NULL,
  `promo_person` int(10) unsigned DEFAULT NULL,
  `dependent_person` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `dlg_id` (`dlg_id`),
  KEY `clientId` (`clientId`),
  CONSTRAINT `dinner_client_l_gift_ibfk_1` FOREIGN KEY (`dlg_id`) REFERENCES `dinner_loyalty_gift` (`id`),
  CONSTRAINT `dinner_client_l_gift_ibfk_2` FOREIGN KEY (`clientId`) REFERENCES `clients` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=255 DEFAULT CHARSET=utf8;




Сама таблица dinner_loyalty_gift определена на несколько десятков строк ниже:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DROP TABLE IF EXISTS `dinner_loyalty_gift`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `dinner_loyalty_gift` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `restaurantId` int(10) unsigned DEFAULT NULL,
  `giftType` tinyint(3) DEFAULT '1' COMMENT 'тип подарка. 1- сумма, 2- подарок, 3- скидка',
  `name` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `description` varchar(250) CHARACTER SET utf8 DEFAULT NULL,
  `value` int(10) DEFAULT NULL COMMENT 'значение подарка, например, id товара, или процент скидки',
  `minOrdLimit` int(11) DEFAULT NULL,
  `ttl` int(8) unsigned DEFAULT '0' COMMENT 'время жизни в минутахасах, ноль - бесконечно',
  `created` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `restaurantId` (`restaurantId`),
  CONSTRAINT `dinner_loyalty_gift_ibfk_1` FOREIGN KEY (`restaurantId`) REFERENCES `object` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39776004
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛебедкинСама таблица dinner_loyalty_gift определена на несколько десятков строк ниже:В этом случае ошибка легитимна - нельзя создать FK на то, чего нет. Порядок создания таблиц, увы, нужно корректировать вручную (в общем случае построение корректного порядка создания таблиц невозможно, ибо ничто не запрещает циклических зависимостей). Поэтому обычная практика - отдельно бэкап структуры (--no-data), который потом рихтуется руками, отдельно данные (--no-create-info).

Ещё лучше - сначала создание таблиц, потом создание ключей. Но это ещё более вдумчивая ручная рихтовка дампа структуры. Впрочем, делается-то это один раз, в отличие от бэкапа данных.
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39776007
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВ этом случае ошибка легитимна - нельзя создать FK на то, чего нет.Насколько я помню, set foreign_key_checks=0; должно помочь и в этом случае. Бывают же и кольцевые зависимости, которые порядком создания таблиц не исправишь.
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39776008
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛебедкинНе получилось! перед восстановлением сделал так:
Код: plaintext
set foreign_key_checks=0;
ошибка сохранилась.Как именно сделал?
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39776013
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЕщё лучше - сначала создание таблиц, потом создание ключей. Но это ещё более вдумчивая ручная рихтовка дампа структуры. Впрочем, делается-то это один раз, в отличие от бэкапа данных.
Но при малейшем изменении структуры данных, придется делать всё по новой ((
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39776014
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЛебедкинНе получилось! перед восстановлением сделал так:
Код: plaintext
set foreign_key_checks=0;
ошибка сохранилась.Как именно сделал?
В начало дамп-файла эту строчку добавил.
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39776027
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкинпри малейшем изменении структуры данных, придется делать всё по новойА никто не обещал, что будет легко...
...
Рейтинг: 0 / 0
Порядок создания таблиц с внешними ключами в mysqldump.
    #39781729
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже проблема с порядком создания таблиц с внешними ключами возникает только в MariaDB. Когда я этот же дамп стал разворачивать на MySQL-5.7, все развернулось без проблем.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядок создания таблиц с внешними ключами в mysqldump.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]