2012-01-17 110 views
16

关于Magento上的这个问题有很多帖子。他们大多数工作,但在执行删除代码/ SQL语句后,类别没有将其值重置为零的问题仍然存在,直到现在还没有解决。删除Magento上的所有产品

这里有没有人有正确的代码或过程来正确删除清单中的所有产品,并且在执行它后类别列表也重置为零?

在此先感谢。

+0

你的意思是身份证号码?你必须重置表的auto_increment主键。 – 2012-01-17 18:02:52

+0

不,我正在计算每个类别下的产品数量。 – 2012-01-17 18:21:41

回答

4

无论用于删除产品的方法如何,重建“类别产品”索引都应修复计数。进入系统>索引管理。选中“类别产品”旁边的框,将操作(右上角)更改为“Reindex”,然后单击“提交”。

+0

我改变了主意。为了那些有类似问题的人的利益,我选择这个作为最合适的答案。 – 2013-02-21 01:19:30

3

为了删除产品,您可以简单地使用后端:
目录>管理产品>选择所有checboxes,然后选择Action = Delete并点击提交。
这可能对数千种产品非常有用。

+4

谢谢。这对400,000 ++产品如何工作? – 2012-01-17 20:28:25

+0

对于那么多的产品来说,它会非常慢并且内存/服务器超时问题。 – MagePsycho 2012-01-18 16:53:08

5

要删除所有产品,您可以使用此查询:

TRUNCATE TABLE `catalog_product_bundle_option`; 
TRUNCATE TABLE `catalog_product_bundle_option_value`; 
TRUNCATE TABLE `catalog_product_bundle_selection`; 
TRUNCATE TABLE `catalog_product_entity_datetime`; 
TRUNCATE TABLE `catalog_product_entity_decimal`; 
TRUNCATE TABLE `catalog_product_entity_gallery`; 
TRUNCATE TABLE `catalog_product_entity_int`; 
TRUNCATE TABLE `catalog_product_entity_media_gallery`; 
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`; 
TRUNCATE TABLE `catalog_product_entity_text`; 
TRUNCATE TABLE `catalog_product_entity_tier_price`; 
TRUNCATE TABLE `catalog_product_entity_varchar`; 
TRUNCATE TABLE `catalog_product_link`; 
TRUNCATE TABLE `catalog_product_link_attribute`; 
TRUNCATE TABLE `catalog_product_link_attribute_decimal`; 
TRUNCATE TABLE `catalog_product_link_attribute_int`; 
TRUNCATE TABLE `catalog_product_link_attribute_varchar`; 
TRUNCATE TABLE `catalog_product_link_type`; 
TRUNCATE TABLE `catalog_product_option`; 
TRUNCATE TABLE `catalog_product_option_price`; 
TRUNCATE TABLE `catalog_product_option_title`; 
TRUNCATE TABLE `catalog_product_option_type_price`; 
TRUNCATE TABLE `catalog_product_option_type_title`; 
TRUNCATE TABLE `catalog_product_option_type_value`; 
TRUNCATE TABLE `catalog_product_super_attribute`; 
TRUNCATE TABLE `catalog_product_super_attribute_label`; 
TRUNCATE TABLE `catalog_product_super_attribute_pricing`; 
TRUNCATE TABLE `catalog_product_super_link`; 
TRUNCATE TABLE `catalog_product_enabled_index`; 
TRUNCATE TABLE `catalog_product_website`; 
TRUNCATE TABLE `catalog_product_entity`; 

TRUNCATE TABLE `cataloginventory_stock`; 
TRUNCATE TABLE `cataloginventory_stock_item`; 
TRUNCATE TABLE `cataloginventory_stock_status`; 

INSERT INTO `catalog_product_link_type`(`link_type_id`,`code`) VALUES (1,'relation'),(2,'bundle'),(3,'super'),(4,'up_sell'),(5,'cross_sell'); 
INSERT INTO `catalog_product_link_attribute`(`product_link_attribute_id`,`link_type_id`,`product_link_attribute_code`,`data_type`) VALUES (1,2,'qty','decimal'),(2,1,'position','int'),(3,4,'position','int'),(4,5,'position','int'),(6,1,'qty','decimal'),(7,3,'position','int'),(8,3,'qty','decimal'); 
INSERT INTO `cataloginventory_stock`(`stock_id`,`stock_name`) VALUES (1,'Default'); 

问候:)

+0

由于数据完整性问题,此查询不起作用。它显示错误'#1701 - 无法截断外键约束中引用的表('dbname'.'catalog_product_bundle_option_value',CONSTRAINT'FK_MKM_CAT_PRD_BNDL_OPT_VAL_OPT_ID_MKM_CAT_PRD_BNDL_OPT_OPT_ID' FOREIGN KEY('option_id')REFERENCES'dbname'.catalog_produ)''。任何想法解决它? – Abaij 2013-07-31 17:28:51

+2

在上面的代码顶部添加'SET FOREIGN_KEY_CHECKS = 0;'并添加'SET FOREIGN_KEY_CHECKS = 1;'底部代码。 – Zaheerabbas 2013-11-26 05:17:00

+0

删除检查数据完整性,交叉手指,并希望数据损坏不会继续='SET FOREIGN_KEY_CHECKS = 0;' – 2014-03-31 15:21:38

51

删除从Magento的所有产品都可以轻松实现,只需运行:

DELETE FROM `catalog_product_entity` 

由于在Magento数据库中设置的外键约束,其中包含产品信息的所有其他表格都会很好地清理。当然,需要一些时间来删除很多产品,但至少可以很好地清理干净。

如果查询不能因为最长执行时间运行,你总是可以运行类似:

DELETE FROM `catalog_product_entity` LIMIT 10000 

更新: 这个逻辑也得到在Magento的核心使用,因此它是安全的使用! https://github.com/OpenMage/magento-mirror/blob/magento-1.8/app/code/core/Mage/ImportExport/Model/Import/Entity/Product.php#L462

+0

这工作得很好,谢谢 – UltimateBrent 2013-02-12 01:06:42

+0

这不会删除类别 – Nicola 2014-06-27 19:37:34

+4

事实上,它不,这是为了删除所有产品。 – 2014-06-30 08:58:26

12

在一个独立的脚本:

<?php 
require 'app/Mage.php'; 
Mage::app('admin')->setUseSessionInUrl(false); 


$products = Mage::getModel('catalog/product')->getCollection();  
foreach ($products as $product) { 
    try { 
     $product->delete(); 
    } catch(Exception $e) { 
     echo "Product #".$product->getId()." could not be remvoved: ".$e->getMessage(); 
    } 
} 

难道,对于更多的产品1400,工作得很好。之后你必须重新驯服。

当心上面的脚本将删除所有您的产品

+0

+1使用Magento脚本应该保留数据完整性,而不是攻击数据库,发现事情不起作用,并关闭完整性检查以后发现事情真的不起作用。 – 2014-03-31 15:49:47

+0

可能产品的完整性问题 – 2014-04-06 15:39:44

+0

对于大量产品(~100000),脚本可以通过添加以下内容来改进:'ini_set(“memory_limit”,“2024M”); ini_set(“max_execution_time”,“86400”);''和'Mage :: log('删除:'。product-> getId());'以获得一些反馈。在屏幕上启动它可能是有意义的。 – paderEpiktet 2016-03-21 15:29:12

2
Mage::getModel('catalog/product')->getCollection()->delete(); 
0

工作就像一个魅力...

PHP的myadmin - 在顶部选择DATABSE(Magento的)SWL,然后粘贴以下内容:

DELETE FROM `catalog_product_entity` 
-4
SELECT * FROM `mage_catalog_product_entity` 

让你列表当前有效的产品。

+1

不,它不。 “积极”可能暗示任何事情。你在这里检索的是你所有产品的清单。尽管如此,这与问题完全没有关系。 – 2015-10-16 01:53:18

1

在Magento 1.7.0上测试。2

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE TABLE `catalog_product_bundle_option`; 
TRUNCATE TABLE `catalog_product_bundle_option_value`; 
TRUNCATE TABLE `catalog_product_bundle_selection`; 
TRUNCATE TABLE `catalog_product_entity_datetime`; 
TRUNCATE TABLE `catalog_product_entity_decimal`; 
TRUNCATE TABLE `catalog_product_entity_gallery`; 
TRUNCATE TABLE `catalog_product_entity_int`; 
TRUNCATE TABLE `catalog_product_entity_media_gallery`; 
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`; 
TRUNCATE TABLE `catalog_product_entity_text`; 
TRUNCATE TABLE `catalog_product_entity_tier_price`; 
TRUNCATE TABLE `catalog_product_entity_varchar`; 
TRUNCATE TABLE `catalog_product_flat_1`; 
TRUNCATE TABLE `catalog_product_link`; 
TRUNCATE TABLE `catalog_product_link_attribute`; 
TRUNCATE TABLE `catalog_product_link_attribute_decimal`; 
TRUNCATE TABLE `catalog_product_link_attribute_int`; 
TRUNCATE TABLE `catalog_product_link_attribute_varchar`; 
TRUNCATE TABLE `catalog_product_link_type`; 
TRUNCATE TABLE `catalog_product_option`; 
TRUNCATE TABLE `catalog_product_option_price`; 
TRUNCATE TABLE `catalog_product_option_title`; 
TRUNCATE TABLE `catalog_product_option_type_price`; 
TRUNCATE TABLE `catalog_product_option_type_title`; 
TRUNCATE TABLE `catalog_product_option_type_value`; 
TRUNCATE TABLE `catalog_product_super_attribute_label`; 
TRUNCATE TABLE `catalog_product_super_attribute_pricing`; 
TRUNCATE TABLE `catalog_product_super_attribute`; 
TRUNCATE TABLE `catalog_product_super_link`; 
TRUNCATE TABLE `catalog_product_enabled_index`; 
TRUNCATE TABLE `catalog_product_website`; 
TRUNCATE TABLE `catalog_product_relation`; 
TRUNCATE TABLE `catalog_category_product_index`; 
TRUNCATE TABLE `catalog_category_product`; 
TRUNCATE TABLE `cataloginventory_stock_item`; 
TRUNCATE TABLE `cataloginventory_stock_status`; 
TRUNCATE TABLE `cataloginventory_stock_status_idx`; 
TRUNCATE TABLE `cataloginventory_stock`; 
TRUNCATE TABLE `core_url_rewrite`; 
INSERT INTO `catalog_product_link_type`(`link_type_id`,`code`) VALUES (1,'relation'),(2,'bundle'),(3,'super'),(4,'up_sell'),(5,'cross_sell'); 
INSERT INTO `catalog_product_link_attribute`(`product_link_attribute_id`,`link_type_id`,`product_link_attribute_code`,`data_type`) VALUES (1,2,'qty','decimal'),(2,1,'position','int'),(3,4,'position','int'),(4,5,'position','int'),(6,1,'qty','decimal'),(7,3,'position','int'),(8,3,'qty','decimal'); 
INSERT INTO `cataloginventory_stock`(`stock_id`,`stock_name`) VALUES (1,'Default'); 
TRUNCATE TABLE `catalog_product_entity`; 
SET FOREIGN_KEY_CHECKS = 1; 
+2

请不要使用将外键检查设置为0的查询。查询运行得更快,但是您冒着数据库损坏的风险。 – 2014-10-16 19:02:18

+0

你不能用FK截断,因为imho mysql会删除表并创建一个新表。 – 2016-08-25 13:01:46

0

在我看来,最简洁的解决方案是这样的:

  • 转到System -> Index Management并设置所有索引“手动更新”索引模式
  • 转到Catalog -> Manage Products,选择所有产品,并使用Delete删除所有产品的操作。

这并不像从数据库中手动删除产品那样快,但它可能是删除所有产品的最合适方法,您不必担心孤立的数据库条目或外键冲突。