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

Я пытаюсь использовать mysqldump для копирования данных с одного сервера на другой. На целевом сервере была установлена ​​предыдущая версия той же базы данных, поэтому все объекты, на которые имеются ссылки, уже существуют. Я проверил вывод из mysqldump, и он включает в себя соответствующие инструкции: (1) отключить проверку внешнего ключа во время отдыха и (2) удалить старые таблицы. Отредактированный отрывок выглядит следующим образом:

/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
...
DROP TABLE IF EXISTS `bins`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `bins` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `site` int(11) NOT NULL,
  `type` varchar(255) NOT NULL,
  `capacity` varchar(255) NOT NULL,
  `quantity` int(11) NOT NULL,
  `cost` decimal(9,2) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `sites_bins_idx` (`site`),
  CONSTRAINT `sites_bins` FOREIGN KEY (`site`) REFERENCES `sites` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=457 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

Я понимаю синтаксис /*!nnnnn ... */ как условный синтаксис, который выполняется только в том случае, если версия сервера выше, чем номер, включенный в число (это моя версия 5.0), поэтому все включенные инструкции SET должны выполняться.

Я запустил файл script, сгенерированный при запуске mysql -p < dump.sql, но получил следующую ошибку:

ERROR 1005 (HY000) at line 27: Can't create table './myschema/bins.frm' (errno: 121)

Запуск запроса show innodb status содержит следующую дополнительную информацию:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
140420 13:15:07 Error in foreign key constraint creation for table `myschema/bins`.
A foreign key constraint of name `myschema/sites_bins` already exists.

Однако, как может существовать ограничение, когда таблица (ы), на которую он ссылается, была отброшена?

mysql> show tables;
Empty set (0.00 sec)

mysql> SELECT    constraint_name,   table_name FROM    information_schema.table_constraints  WHERE    constraint_type = 'FOREIGN KEY'    AND table_schema = DATABASE()  ORDER BY    constraint_name;
+--------------------------+------------------+
| constraint_name          | table_name       |
+--------------------------+------------------+
| clients_sites            | sites            |
| client_contacts          | contacts         |
| scheduledvisit_site      | scheduled_visits |
| sites_bins               | bins             |
| sites_visits             | site_visits      |
| sitevisit_sitevisitentry | site_visit_entry |
+--------------------------+------------------+
6 rows in set (0.00 sec)

Я даже пробовал drop database myschema, но ограничения по-прежнему остаются позади даже после этого.

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

Ответ 1

Обработка имен объектов InnoDB нечувствительна к регистру. MySQL зависит от обработки имени файла операционной системы, что в моем случае было чувствительным к регистру. Была создана предыдущая версия базы данных с именами, заглавными в начале, поэтому, когда MySQL знал о базе данных myschema, которая была пустой, а myschema, которая не была такой, InnoDB считал, что они одинаковые. Удаление базы данных myschema позволило мне восстановить дамп из удаленной системы.