MySQL:导入

时间:2016-03-02 09:26:29

标签: mysql

在我创建了数据库的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版本有关,但我没有找到任何关于此的错误报告。

谢谢。

3 个答案:

答案 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