重新索引目录上的Magento和错误1452(完整性约束违规)

时间:2013-01-29 23:31:46

标签: mysql magento

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行,因此看起来并非如此。我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:3)

我在考虑了一些之后想出了这个问题 - 问题来自索引过程,希望在catalog_category_product_index表中插入一行,其中product_id或category_id不存在。这就是造成违规的原因。

如果此步骤上的索引处理失败将随后运行查询以识别导致问题的行,那将是很好的,但在此之前,您可以运行这两个查询,这将告诉您哪个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)

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

答案 1 :(得分: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);

为我工作但可能会为您打破一些产品。