2015-03-24 1 views
0

Я написал код, который добавляет данные о запасах в продукт. Он отлично работает на моей тестовой БД. Теперь я начал тестировать код на клиентах БД и эта ошибка возникает:Нарушение ограничения целостности Magento: 1062 Повторяющаяся ошибка ввода при сохранении позиции запаса?

SQLSTATE [23000]: Integrity нарушение ограничения: 1062 Дублированный запись «449-1» для ключа «UNQ_MAGENTO_CATALOGINVENTORY_STOCK_ITEM_PRODUCT_ID_STOCK_ID», запрос был : INSERT INTO magento_cataloginventory_stock_item (product_id, stock_id, qty, min_sale_qty, use_config_min_sale_qty, max_sale_qty, use_config_max_sale_qty, is_in_stock, low_stock_date, manage_stock, use_config_manage_stock, stock_status_changed_auto) VALUES (,,,,,,,,,,, )

Это код????????

$product->setStockData(array(
             'use_config_manage_stock' => 0, //'Use config settings' checkbox 
             'manage_stock' => 1, //manage stock 
             'min_sale_qty' => 1, //Minimum Qty Allowed in Shopping Cart 
             'max_sale_qty' => 999, //Maximum Qty Allowed in Shopping Cart 
             'is_in_stock' => 1, //Stock Availability 
             'qty' => 999 //qty 
            ) 
           ); 

Ошибка появляется, когда я сохраняю продукт следующим образом:

$product->save(); 

Без кода запаса продукт может быть сохранен. Я проверил файл импорта базы данных, который у меня есть, и в нем есть проверки ключа forgeign, поэтому проблема не может быть проблемой. Я запускаю Magento 1.9.

Любые идеи?

Спасибо!

ответ

0

cataloginventory_stock_item таблица имеет множественный столбец уникальный ключ состоит из PRODUCT_ID и stock_id. Очевидно, что это называется: UNQ_CATALOGINVENTORY_STOCK_ITEM_PRODUCT_ID_STOCK_ID и вы нарушаете его, вставив дубликат записи, где: product_id = 449 и stock_id = 1.

Убедитесь, что вы не нарушаете это правило в своих новых записях.

В любом случае вы также можете попробовать заменить: $product->save(); с: $product->getResource()->save($product); (Как было предложено here)

0

Используйте этот запрос:

delete FROM cataloginventory_stock_item 
where product_id not in(SELECT entity_id FROM catalog_product_entity); 

Это удалит запас продуктов, которые были удалены.

0

Я использовал этот запрос:

delete FROM cataloginventory_stock_item 
where product_id not in(SELECT entity_id FROM catalog_product_entity); 

и он работал на меня.

0

если ошибка показывает для таблицы 'cataloginventory_stock_item' having 'UNQ_CATALOGINVENTORY_STOCK_ITEM_PRODUCT_ID_STOCK_ID' index,

то, пожалуйста, убедитесь, что вы передаете другой продукт SKU от вашего сценария каждый раз.потому что, если вы передадите один и тот же SKU, тогда он получит идентификатор продукта на основе этого SKU и получит дубликат записи этого идентификатора продукта.

Смежные вопросы