导入文件只新增一个SKU,却报“URL key for specified store already exists”。后台按商品名和SKU都找不到重复项,是因为唯一约束落在 url_rewrite.store_id + request_path,冲突对象可能是分类、自定义重写或已删除实体留下的记录。

先把报错的request_path还原出来

CSV里若没有url_key,Magento会由name生成。把目标Store的URL suffix也算进去,例如 blue-shirt.html。随后查询:

SELECT url_rewrite_id,entity_type,entity_id,request_path,target_path,redirect_type,store_id,metadata
FROM url_rewrite
WHERE request_path IN ('blue-shirt','blue-shirt.html')
ORDER BY store_id;

不要只查store_id=0。产品URL重写通常按Store View保存,而导入选择的Behavior和网站分配会决定写哪些Store。

根据结果处理,不要一刀切

  • 冲突记录指向有效商品:修改新商品url_key,或先确认旧商品是否应保留该地址;
  • 指向分类:商品和分类不能在同一Store占用相同request_path,给其中一个增加路径;
  • redirect_type为301:这是旧地址历史。若新商品必须使用该路径,先评估外链和SEO,再删除或改写这条重定向;
  • entity_id已不存在:备份该行,确认实体表无记录后再做定向删除;
  • 只有某个Store冲突:在CSV明确写store_view_code,并为该Store给出不同url_key。

定向清理示例

START TRANSACTION;
SELECT * FROM url_rewrite WHERE url_rewrite_id=456 FOR UPDATE;
-- 再次确认entity_id对应实体不存在后执行
DELETE FROM url_rewrite WHERE url_rewrite_id=456;
COMMIT;

bin/magento indexer:reindex catalog_url
bin/magento cache:clean

生产库执行前先导出该行。不要按request_path模糊删除多条记录,也不要truncate url_rewrite;那会丢失自定义重定向。

重新导入后的检查

打开每个受影响Store的商品URL,确认返回200;旧URL若应保留,确认只跳转一次;再查url_rewrite确保同一store_id下只有一个request_path。最后把url_key列纳入今后的CSV模板,避免依赖名称自动生成。