InnoDB抱怨在删除所有表后恢复数据库时正在使用的外键名称

时间:2014-04-20 13:23:03

标签: mysql constraints innodb

我正在尝试使用mysqldump将数据从一台服务器复制到另一台服务器。目标服务器安装了相同数据库的先前版本,因此引用的所有对象都已存在。我检查了mysqldump的输出,它包括适当的语句,以便(1)在娱乐期间禁用外键检查,以及(2)删除旧表。编辑后的摘录如下:

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@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语句都应该执行。 / p>

我运行了运行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 个答案:

答案 0 :(得分:0)

InnoDB对对象名称的处理不区分大小写。 MySQL依赖于操作系统的文件名处理,在我的例子中是敏感。已经创建了以前版本的数据库,其名称在开头大写,因此虽然MySQL知道数据库myschema是空的而MySchema不是,但InnoDB认为这两个是相同。删除MySchema数据库允许我从远程系统恢复转储。