在我创建了数据库的mysqldump之后我遇到了问题,当我尝试重新导入它时,我得到一个"重复的密钥名称"错误。
DROP TABLE IF EXISTS `et_prevision`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `et_prevision` (
`pk_prevision` int(11) NOT NULL AUTO_INCREMENT,
`fk_account` int(11) NOT NULL,
`fk_nature` int(11) NOT NULL,
`fk_prevision_level` int(11) NOT NULL,
`fk_analysis_axis1` int(11) DEFAULT NULL,
`fk_analysis_axis2` int(11) DEFAULT NULL,
`fk_creator` int(11) DEFAULT NULL,
`fk_modifier` int(11) DEFAULT NULL,
`fk_reconciliation` int(11) DEFAULT NULL,
`fk_sicav` int(11) DEFAULT NULL,
`fk_rate` int(11) DEFAULT NULL,
`fk_prevision` int(11) DEFAULT NULL,
`fk_funding` int(11) DEFAULT NULL,
`operation_date` date NOT NULL,
`value_date` date NOT NULL,
`creation_date` date NOT NULL,
`modification_date` date NOT NULL,
`status` int(11) DEFAULT NULL,
`amount` decimal(14,5) NOT NULL,
`libelle` varchar(255) DEFAULT NULL,
`piece_number` varchar(15) DEFAULT NULL,
`commentaire` varchar(255) DEFAULT NULL,
`reconciliation_libelle` varchar(255) DEFAULT NULL,
`monitored` int(11) DEFAULT NULL,
`operation_count` int(11) NOT NULL,
`is_subscription` int(11) DEFAULT NULL,
`cycling` int(11) DEFAULT NULL,
`cycle_count` int(11) DEFAULT NULL,
`remittance_reference` varchar(35) DEFAULT NULL,
`is_principal` int(11) DEFAULT NULL,
`sicav_parts_count` decimal(14,5) DEFAULT NULL,
`sicav_rate` decimal(14,5) DEFAULT NULL,
`investment_margin` decimal(14,5) DEFAULT NULL,
`investment_effective_rate` decimal(14,5) DEFAULT NULL,
`investment_day_count` int(11) DEFAULT NULL,
`investment_count_type` int(11) DEFAULT NULL,
`attachment_file_name` varchar(255) DEFAULT NULL,
`investment_type` int(11) DEFAULT NULL,
`print_date` date DEFAULT NULL,
`prevision_batch` int(11) NOT NULL,
`fk_interface` int(6) DEFAULT NULL,
PRIMARY KEY (`pk_prevision`),
KEY `fk_prev_account` (`fk_account`),
KEY `fk_prev_nature` (`fk_nature`),
KEY `fk_prev_prevision_level` (`fk_prevision_level`),
KEY `fk_prev_analysis_axis1` (`fk_analysis_axis1`),
KEY `fk_prev_fk_analysis_axis2` (`fk_analysis_axis2`),
KEY `fk_prev_creator` (`FK_CREATOR`),
KEY `fk_prev_modifier` (`FK_MODIFIER`),
KEY `fk_prev_reconciliation` (`fk_reconciliation`),
KEY `fk_prev_sicav` (`fk_sicav`),
KEY `fk_prev_rate` (`fk_rate`),
KEY `fk_prev_prev` (`fk_prevision`),
KEY `fk_prev_funding` (`fk_funding`),
KEY `fk_interface_to_interface` (`FK_INTERFACE`),
CONSTRAINT `fk_interface_to_interface` FOREIGN KEY (`FK_INTERFACE`) REFERENCES `et_p_interface` (`pk_interface`) ON DELETE SET NULL,
CONSTRAINT `fk_prev_account` FOREIGN KEY (`fk_account`) REFERENCES `t_account` (`PK_ID`),
CONSTRAINT `fk_prev_analysis_axis1` FOREIGN KEY (`fk_analysis_axis1`) REFERENCES `et_p_axe_analyse_2` (`pk_axe_analyse_2`) ON DELETE SET NULL,
CONSTRAINT `fk_prev_creator` FOREIGN KEY (`fk_creator`) REFERENCES `t_user` (`PK_ID`),
CONSTRAINT `fk_prev_fk_analysis_axis2` FOREIGN KEY (`fk_analysis_axis2`) REFERENCES `et_p_axe_analyse_3` (`pk_axe_analyse_3`) ON DELETE SET NULL,
CONSTRAINT `fk_prev_funding` FOREIGN KEY (`fk_funding`) REFERENCES `et_funding` (`pk_funding`),
CONSTRAINT `fk_prev_modifier` FOREIGN KEY (`fk_modifier`) REFERENCES `t_user` (`PK_ID`),
CONSTRAINT `fk_prev_nature` FOREIGN KEY (`fk_nature`) REFERENCES `et_p_nature` (`pk_nature`),
CONSTRAINT `fk_prev_prev` FOREIGN KEY (`fk_prevision`) REFERENCES `et_prevision` (`pk_prevision`),
CONSTRAINT `fk_prev_prevision_level` FOREIGN KEY (`fk_prevision_level`) REFERENCES `et_p_prevision_level` (`pk_prevision_level`),
CONSTRAINT `fk_prev_rate` FOREIGN KEY (`fk_rate`) REFERENCES `et_p_rate` (`pk_rate`),
CONSTRAINT `fk_prev_reconciliation` FOREIGN KEY (`fk_reconciliation`) REFERENCES `et_reconciliation` (`pk_reconciliation`) ON DELETE SET NULL,
CONSTRAINT `fk_prev_sicav` FOREIGN KEY (`fk_sicav`) REFERENCES `et_p_sicav` (`pk_sicav`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
错误发生在" fk_prev_creator"键。我确信我在数据库的任何地方都没有任何具有相同名称的密钥,我尝试将其重命名为" fk_prev_creator1",这给了我同样的错误。我尝试删除密钥声明,并在" fk_prev_modifier"上抛出另一个错误。如果我删除了两个密钥声明,一切正常,但是,因为这个转储应该用于安装目的,我想知道为什么这些精确密钥不能按预期工作。
编辑:为了您的信息,转储和导入都是在mysql 5.1.33下的服务器上进行的。
Edit2:我尝试导入5.6.X服务器,它就像一个魅力。所以它似乎与MySQL版本有关,但我没有找到任何关于此的错误报告。
谢谢。
答案 0 :(得分:1)
所以我终于找到了导入无效的原因。 如果仔细观察KEy de clarations:
KEY `fk_prev_creator` (`FK_CREATOR`),
KEY `fk_prev_modifier` (`FK_MODIFIER`),
它们与CONSTRAINTS声明略有不同:
CONSTRAINT `fk_prev_creator` FOREIGN KEY (`fk_creator`) REFERENCES `t_user` (`PK_ID`),
CONSTRAINT `fk_prev_modifier` FOREIGN KEY (`fk_modifier`) REFERENCES `t_user` (`PK_ID`),
不同之处在于,在KEY声明中,字段名称是大写字母,而不是CONSTRAINT声明。在5.1.X中,它很重要,而不是5.6.X,所以在这种情况下,MySQL看起来好像我试图声明另一个规则,并且不喜欢它。
tl; dr:5.1.X在这种特殊情况下区分大小写。
答案 1 :(得分:0)
重新导入数据库时,需要先删除整个数据库。不完全确定为什么会这样,但我刚才有这个问题,这就是我修复它的方法。
如果您正在运行命令,只需将其添加到mysqldump
:
--add-drop-database
检查mysql manual是否有此选项。
否则,您可以编辑整个查询,并将其添加到最顶层:
/*!40000 DROP DATABASE IF EXISTS `myDatabase` */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ dbName ......
答案 2 :(得分:0)
删除目标数据库,然后重新创建它(例如mysql -e'如果存在mydb,则删除数据库;创建数据库mydb;')对我有用。我还必须关闭外键约束,然后在转储末尾将它们重新打开,以防止在表中声明FK但尚未创建目标表时发生错误。
Mysql 5.7.29转储导入到5.7.27