3

Magento 拒绝重新索引我的产品目录。它正在记录此错误:

2013-01-29T23:24:51+00:00 DEBUG (7): Exception message: SQLSTATE[23000]: 
Integrity constraint violation: 1452 Cannot add or update a child row: 
a foreign key constraint fails (`cjsquash_mgnt1`.`catalog_category_product_index`, 
CONSTRAINT `FK_CAT_CTGR_PRD_IDX_CTGR_ID_CAT_CTGR_ENTT_ENTT_ID` FOREIGN KEY (`category_id`) REFERENCES `catalog_category_entity` (`entity_id`))

我认为这意味着 catalog_category_product_index 中有一个无效行,并且 catalog_category_entity 表中缺少一个值,但我运行了这个查询:

SELECT *
FROM catalog_category_product_index
where category_id not in (select entity_id from 
catalog_category_entity)

它返回 0 行,因此情况似乎并非如此。我能做些什么来解决这个问题?

4

2 回答 2

3

在考虑了更多之后,我自己弄清楚了这一点 - 问题来自索引过程,希望在 product_id 或 category_id 不存在的 catalog_category_product_index 表中插入一行。这就是导致违规的原因。

如果此步骤中的索引处理失败随后会运行查询以识别导致问题的行,那就太好了,但在此之前,您可以运行这两个查询,这将告诉您哪个 product_id 或 category_id 导致了问题。这两个查询都应该返回 0 条记录。如果他们返回记录,您将确切知道哪个产品属于不存在的类别或哪个类别具有不存在的产品。你可以

SELECT * FROM `catalog_category_product` WHERE 
product_id not in (select entity_id from catalog_product_entity)

SELECT * FROM `catalog_category_product` WHERE 
category_id not in (select entity_id from catalog_category_entity)

然后,您可以删除有问题的行,或者更加谨慎,编辑有问题的产品或类别并重新保存其类别或产品,以便将良好的数据放入问题表中。然后索引将起作用。

于 2013-01-30T09:06:22.127 回答
0

首先创建一个备份

一个根本的解决方法是删除所有这些错误的引用:

Delete FROM `catalog_category_product` 
WHERE product_id not in (select entity_id from catalog_product_entity) 
  OR category_id not in (select entity_id from catalog_category_entity);

为我工作,但可能会为你破坏一些产品。

于 2015-07-22T09:43:02.850 回答