Magento2 MySQL带MAX的JOIN更新多表提示目标表不可更新如何修复
Magento 2 MySQL 批量更新产品价格及时间字段修复方案
错误原因
报错是因为原SQL中关联的e表是通过GROUP BY聚合生成的临时派生表,MySQL不支持直接对这类非物理存储的派生表执行UPDATE操作。
修复思路
- 不再直接关联聚合派生表,改为直接关联物理表
catalog_product_entity进行更新 - 保留原逻辑中仅更新每个产品最新版本(对应最大row_id)的筛选规则
修复后SQL
SET @etype = (SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code = 'catalog_product'); SET @price = (SELECT attribute_id FROM eav_attribute WHERE attribute_code = 'price' AND entity_type_id = @etype); -- Admin store ID SET @store = 0; UPDATE catalog_product_entity_decimal d1 -- 直接关联产品实体物理表 JOIN catalog_product_entity cpe ON d1.row_id = cpe.row_id JOIN import_price ip ON cpe.sku = ip.sku WHERE d1.store_id = @store AND d1.attribute_id = @price -- 筛选仅更新每个产品的最新版本记录 AND cpe.row_id = (SELECT MAX(row_id) FROM catalog_product_entity WHERE entity_id = cpe.entity_id) -- 同时更新价格和更新时间字段 SET d1.value = ip.price, cpe.updated_at = NOW();
补充说明
- 你提供的表结构中
updated_at字段本身已经定义了ON UPDATE CURRENT_TIMESTAMP属性,即便不主动SET该字段,只要catalog_product_entity的记录被更新,该字段会自动赋值为当前时间,你可以根据需求选择是否保留SET中的赋值逻辑 - 执行SQL前建议先将UPDATE语句替换为SELECT语句,校验匹配的产品记录和价格是否正确,避免误改数据
- 如果Magento开启了产品平表模式,执行完SQL后需要重新索引产品平表,前台才能展示最新的价格信息
内容的提问来源于stack exchange,提问作者BigDX
相关产品推荐
相关产品推荐

