2013-10-15 4 views
0

UPDATE: Darn - не знаете ли вы, что в ту минуту, когда я отправил сообщение, я получил ага! Основная таблица должна быть первой в создании.Добавление внешних ключей в MySQL - errno 150 - using mysqldump

ОБНОВЛЕНИЕ 2: Для всех, кто был следующим, проблема заключалась в моей команде mysqldump, содержащей параметр --compact. Это устранило функцию mysqldump, включающую FOREIGN_KEY_CHECKS = 0; в верхней части файла дампа. Теперь с компактным удалением проблема полностью решена. Не нужно вручную вставлять это в мой файл дампа.

Могу ли я указать порядок таблиц при выполнении mysqldump?

Я загружаю базу данных localhost MySQL на свой общий сервер. Я получаю следующую ошибку, пытающуюся воссоздать таблицу с внешним ключом. "# 1005 - Невозможно создать таблицу 'username_test.gemdetail' (errno: 150). Ниже приведена инструкция sql. Когда предложение Constraint удаляется, таблицы импортируются просто штрафом)

Из базы данных MySQL - FOREIGN KEY Constraints Документация: Если вы заново создаете таблицу, которая была удалена, она должна иметь определение, соответствующее ограничениям внешнего ключа ссылаясь на него. Он должен иметь правильные имена и типы столбцов, и он должен иметь индексы на ссылочных ключах, как указано ранее. Если они не выполняются, MySQL возвращает номер ошибки 1005 и ссылается на ошибку 150 в сообщении об ошибке.

Я проверил для следующих условий (поправьте меня, пожалуйста, если я пропустил что-то):

1) Эти две таблицы должны быть ENGINE = InnoDB. - ДА 2) Две таблицы должны иметь одну и ту же кодировку. - ДА 3) Столбец PK в родительской таблице и столбец FK должны быть одного и того же типа данных. - ДА 4) Столбец PK в родительской таблице и столбец FK, если они имеют тип сортировки определений, должны иметь один и тот же тип сортировки; - НЕ ОПРЕДЕЛЕНА 5) Если в таблице внешнего ключа есть данные, значение (-ы) столбца FK должно соответствовать значениям в столбцах PK родительской таблицы. - НЕТ ДАННЫХ 6) И детская таблица не может быть временной таблицей. - N/A

Я также попытался импортировать в новую пустую базу данных. Есть идеи? Заранее спасибо за вашу помощь.

Соответствующая часть кода SQL, который генерирует MySQLDump (я удалил другие столбцы & ключи ради читаемости, но это урезанный код дает тот же результат):

DROP TABLE IF EXISTS `gemdetail`; 
CREATE TABLE `gemdetail` (
    `gemdetailid` int(10) NOT NULL AUTO_INCREMENT, 
    `gemid` int(10) NOT NULL, 
    PRIMARY KEY (`gemdetailid`), 
    KEY `gemid` (`gemid`), 
    CONSTRAINT `gemdetail_ibfk_1` FOREIGN KEY (`gemid`) REFERENCES `gems` (`gemid`) ON DELETE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=875 DEFAULT CHARSET=utf8; 

DROP TABLE IF EXISTS `gems`; 
CREATE TABLE `gems` (
    `gemid` int(10) NOT NULL AUTO_INCREMENT, 
    `userid` int(10) NOT NULL, 
    PRIMARY KEY (`gemid`), 
    KEY `userid` (`userid`) 
) ENGINE=InnoDB AUTO_INCREMENT=528 DEFAULT CHARSET=utf8; 

Наконец информация о версии базы данных:

Сервер: Localhost через сокет UNIX Программное обеспечение: MySQL Версия программного обеспечения: 5.5.32-log - Сервер сообщества MySQL (GPL) (BetterLinux 01 Sep 5 2013 23:04:40) Версия протокола: 10

+0

Да, мы иногда не знаем, что такое настоящий вопрос. Что касается неясности, то @Filipe Silva смог дать ответ, не создавая нового вопроса. Как и в других сообщениях, каждый, кто ищет эту проблему, часто объединяет эти проблемы. – mseifert

ответ

2

Необходимо сначала создать столовые камни, так как вы ссылаетесь на него в таблице gemdetail, поэтому уже существует:

DROP TABLE IF EXISTS `gems`; 
CREATE TABLE `gems` (
    `gemid` int(10) NOT NULL AUTO_INCREMENT, 
    `userid` int(10) NOT NULL, 
    PRIMARY KEY (`gemid`), 
    KEY `userid` (`userid`) 
) ENGINE=InnoDB AUTO_INCREMENT=528 DEFAULT CHARSET=utf8; 

DROP TABLE IF EXISTS `gemdetail`; 
CREATE TABLE `gemdetail` (
    `gemdetailid` int(10) NOT NULL AUTO_INCREMENT, 
    `gemid` int(10) NOT NULL, 
    PRIMARY KEY (`gemdetailid`), 
    KEY `gemid` (`gemid`), 
    CONSTRAINT `gemdetail_ibfk_1` FOREIGN KEY (`gemid`) REFERENCES `gems` (`gemid`) ON DELETE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=875 DEFAULT CHARSET=utf8; 

sqlfiddle demo

для создания таблиц после того, как туздЫшпр и не дают ошибок для внешних ключей, открыть файл дампа поместить это заявление в начале:

SET FOREIGN_KEY_CHECKS=0; 
+0

Да, это окончательное решение и то, что решает проблему. Благодарю. – mseifert

+0

Я имел в виду просто дать ему одну точку пальца вверх (он был за вами позади). Я исправил это. Еще раз спасибо. – mseifert

+0

Нет проблем. Рад, что вы его работали. –

1

вы должны создать «драгоценные камни» перед «gemdetail», переключить создание запросов.

+0

Я получил ага! ответьте второй после того, как я разместил сообщение. Спасибо, что ответили быстро. Теперь вопрос в том, могу ли я использовать mysqldump для правильного размещения порядка таблиц? В настоящее время я использую: mysqldump -h localhost -u user -ppassword -compact -add-drop-table -quick dbname> dump.sql – mseifert

+0

извините, я не слышал чего-то такого, как вещь ... Я искал бит, но для этого нет ничего ... Отключение foreign_key_checks делает ваши запросы вставки быстрее, это не для игнорирования проблем с созданием. – tanaydin

+1

Это более быстрые вставки * и * возможность создавать таблицы в любом порядке: http: // dev. mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html ... Отсутствующие цели ограничений внешнего ключа молча разрешены, а несоответствия (например, для столбца другого типа данных) все равно будут ошибка. –

Смежные вопросы