2014-10-16 1 views
1

Я оборачивать вокруг моей головы, почему следующий код бросает ошибку на меня: Ошибки я получаю:Дублировать запись «1» для ключ «PRIMARY» в миграции данных в Magento

[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; 

делает вы знаете, что здесь происходит? Возможно ли, что идентификатор «0» имеет какое-то отношение к нему? Когда я повторяю запрос с несколькими строками без ID = 0-entry, он работает. Так что здесь происходит?

+0

Этот ответ помог мне: [введите ссылку здесь] (http://stackoverflow.com/questions/1142472/how-to-force-mysql-to-take-0-as-a-valid-auto-increment -стоимость) –

ответ

0

Привет из-за ограничений по внешнему ключу, а также из-за автоматического приращения id вышеуказанного запроса, возвращающего ошибку. для первой вставки, вы предоставляете store_id = 0, но в качестве своего автоматического инкремента id его значение для первой вставки = 1, поэтому для второй вставки запросите свою ошибку бросания 1-1 дубликат.

запустите дополнительный запрос на обновление, чтобы исправить файл store_id. Я изменил store_id на 1 и 2 вместо 0,1 для 2 инструкции insert, затем я обновляю их, чтобы исправить значения.

запустить весь 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;

0

Этот ответ помог мне here.

Основное решение заключается в следующем:

Blockquote SET [GLOBAL | SESSION] sql_mode = 'NO_AUTO_VALUE_ON_ZERO'

Смотрите мой комментарий для дополнительного выпуска я решил тоже с этим переопределяются середине скрипт.