批量导入后价格变成 0,第一件事不是再导入一次,而是冻结原 CSV、导入行为和后台报告。重复导入可能把更多 Store View 或子商品覆盖成 0。先列出受影响 SKU,并保留导入前备份用于比较。

CSV 中的空值并不总等于“不修改”

用不会自动改格式的文本工具检查原始文件:

file products.csv
head -n 3 products.csv
python3 -c "import csv; f=open('products.csv',newline='',encoding='utf-8-sig'); r=csv.DictReader(f); print([k for k in r.fieldnames if 'price' in k])"

重点列包括 price、special_price、special_price_from_date、special_price_to_date、store_view_code、product_websites。某些表格软件会把空字符串、0、科学计数法或日期自动改写。

取一个受影响 SKU 与一个正常 SKU 对照

SELECT entity_id, sku FROM catalog_product_entity
WHERE sku IN ('PRICE-ZERO','PRICE-OK');

SELECT attribute_id, attribute_code, backend_type
FROM eav_attribute
WHERE entity_type_id=(SELECT entity_type_id FROM eav_entity_type WHERE entity_type_code='catalog_product')
AND attribute_code IN ('price','special_price');

按查询到的属性 ID 和当前版本的实体键读取 decimal 表,比较 store_id。不要把示例 attribute_id 写死:

SELECT store_id, entity_id, attribute_id, value
FROM catalog_product_entity_decimal
WHERE entity_id IN (101,102)
  AND attribute_id IN (75,76)
ORDER BY entity_id, attribute_id, store_id;

Default Scope 有正常价格而网站前台显示 0,继续查 Website 级价格范围和索引;数据库值就是 0,则回到导入映射。

可配置商品的价格看子商品

新版 Magento 2 的可配置商品展示价格通常来自可售子商品。导入若只给父商品价格、子商品 price 为空或为 0,前台最低价就可能变成 0。查询关系:

SELECT parent_id, child_id
FROM catalog_product_super_link
WHERE parent_id = 101;

SELECT sku, entity_id FROM catalog_product_entity
WHERE entity_id IN (SELECT child_id FROM catalog_product_super_link WHERE parent_id=101);

恢复时使用小批量、明确列

从备份或业务系统生成只包含 5 个测试 SKU 的修复 CSV,明确设置 sku、price、store_view_code 和需要的特殊价格列。先在后台 Check Data,保存错误报告,再导入。不要用“Replace”行为修价格,除非你明确接受删除重建商品的后果。

php bin/magento indexer:reindex catalog_product_price
php bin/magento cache:clean full_page block_html

导入后从数据库、商品页、分类页、购物车各核对一次。对可配置商品切换两个子项,对两个客户组和网站分别验证。确认小批量无误后再扩大到完整清单,并把修复前后的 SKU/价格差异存档,而不是只看后台“Import successfully”。