我正在尝试使用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
,但即使在此之后,约束仍然落后。
在删除表后,这些约束如何被遗忘?我如何摆脱它们以便重新创建各自的表格?
答案 0 :(得分:0)
InnoDB对对象名称的处理不区分大小写。 MySQL依赖于操作系统的文件名处理,在我的例子中是敏感。已经创建了以前版本的数据库,其名称在开头大写,因此虽然MySQL知道数据库myschema
是空的而MySchema
不是,但InnoDB认为这两个是相同。删除MySchema
数据库允许我从远程系统恢复转储。