Magento中数据迁移中的键'PRIMARY'重复输入'1'

时间:2014-10-16 10:08:45

标签: mysql magento data-migration

我围绕着为什么以下代码向我抛出错误:我得到的错误是:

[ERROR in query 5] Duplicate entry '1' for key 'PRIMARY'

这是我正在执行的查询:

DROP TABLE IF EXISTS `core_store`;

CREATE TABLE `core_store` (
  `store_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Store Id',
  `code` varchar(32) DEFAULT NULL COMMENT 'Code',
  `website_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Website Id',
  `group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Group Id',
  `name` varchar(255) NOT NULL COMMENT 'Store Name',
  `sort_order` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Sort Order',
  `is_active` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Activity',
  PRIMARY KEY (`store_id`),
  UNIQUE KEY `UNQ_CORE_STORE_CODE` (`code`),
  KEY `IDX_CORE_STORE_WEBSITE_ID` (`website_id`),
  KEY `IDX_CORE_STORE_IS_ACTIVE_SORT_ORDER` (`is_active`,`sort_order`),
  KEY `IDX_CORE_STORE_GROUP_ID` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores';

LOCK TABLES `core_store` WRITE;
/*!40000 ALTER TABLE `core_store` DISABLE KEYS */;

INSERT INTO `core_store` (`store_id`, `code`, `website_id`, `group_id`, `name`, `sort_order`, `is_active`)
VALUES
    (0,'admin',0,0,'Admin',0,1),
    (1,'store',1,1,'Store',0,1);

/*!40000 ALTER TABLE `core_store` ENABLE KEYS */;
UNLOCK TABLES;

当我删除除主要键之外的所有键时,我也会收到此错误:

DROP TABLE IF EXISTS `core_store`;

CREATE TABLE `core_store` (
  `store_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Store Id',
  `code` varchar(32) DEFAULT NULL COMMENT 'Code',
  `website_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Website Id',
  `group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Group Id',
  `name` varchar(255) NOT NULL COMMENT 'Store Name',
  `sort_order` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Sort Order',
  `is_active` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Activity',
  PRIMARY KEY (`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores';

LOCK TABLES `core_store` WRITE;
/*!40000 ALTER TABLE `core_store` DISABLE KEYS */;

INSERT INTO `core_store` (`store_id`, `code`, `website_id`, `group_id`, `name`, `sort_order`, `is_active`)
VALUES
    (0,'admin',0,0,'Admin',0,1),
    (1,'store',1,1,'Store',0,1);

/*!40000 ALTER TABLE `core_store` ENABLE KEYS */;
UNLOCK TABLES;

有谁知道这里出了什么问题? ID是' 0' 0或许与它有关?当我用多行没有ID = 0条目重复查询时,它可以工作。那么这里发生了什么?

2 个答案:

答案 0 :(得分:0)

嗨由于外键约束而且由于自动递增id而导致上述查询返回错误。 对于第一个插入,你提供store_id = 0但是作为一个自动增量id,它的值为first insert = 1所以对于第二个插入查询它的抛出错误1-1重复。

请运行其他更新查询以更正store_id。 我已经将store_id更改为1和2而不是0,1表示2插入语句然后我将它们更新为正确的值。

运行整个sql,从SET FOREIGN KEY开始,更新查询,不仅更新查询。

我在张贴之前测试了它。

SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `core_store`;

CREATE TABLE `core_store` (
  `store_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Store Id',
  `code` varchar(32) DEFAULT NULL COMMENT 'Code',
  `website_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Website Id',
  `group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Group Id',
  `name` varchar(255) NOT NULL COMMENT 'Store Name',
  `sort_order` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Sort Order',
  `is_active` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Activity',
  PRIMARY KEY (`store_id`),
  UNIQUE KEY `UNQ_CORE_STORE_CODE` (`code`),
  KEY `IDX_CORE_STORE_WEBSITE_ID` (`website_id`),
  KEY `IDX_CORE_STORE_IS_ACTIVE_SORT_ORDER` (`is_active`,`sort_order`),
  KEY `IDX_CORE_STORE_GROUP_ID` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores';

LOCK TABLES `core_store` WRITE;
/*!40000 ALTER TABLE `core_store` DISABLE KEYS */;

INSERT INTO `core_store` (`store_id`, `code`, `website_id`, `group_id`, `name`, `sort_order`, `is_active`)
VALUES
(1,'admin',0,0,'Admin',0,1),
(2,'store',1,1,'Store',0,1);

UPDATE `core_store` SET `store_id` = '0' WHERE `store_id` = '1' COLLATE utf8_bin LIMIT 1;

UPDATE `core_store` SET `store_id` = '1' WHERE `store_id` = '2' COLLATE utf8_bin LIMIT 1;

/*!40000 ALTER TABLE `core_store` ENABLE KEYS */;
UNLOCK TABLES;

答案 1 :(得分:0)

这个答案帮助了我here

基本解决方案是:

  

块引用   SET [GLOBAL | SESSION] sql_mode =' NO_AUTO_VALUE_ON_ZERO'

请参阅我的评论,我还解决了其中一个问题,因为这是在中间脚本中被覆盖的。