Magento 2 导入商品时出现 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry,说明数据库准备写入的组合违反了唯一索引。它不一定只是 CSV 中有两个相同 SKU。错误里通常会给出重复值和索引名,索引名比最后那串数字更重要。

先把错误拆成“表、索引、键值”

完整异常中找到目标表,例如 catalog_product_entitycatalog_product_website、EAV value 表或 URL rewrite 表。再查看表结构中的唯一索引:

SHOW CREATE TABLE catalog_product_website\G
SHOW INDEX FROM catalog_product_website;

如果唯一索引由 product_id + website_id 组成,重复代表同一商品与网站关联被写入两次;如果是 SKU 唯一索引,则要查数据库是否已有大小写或空格差异的 SKU。不要只根据错误值猜测列顺序。

CSV 内部重复和数据库历史重复要分开

先在导入文件中按 SKU 排序,检查前后空格、不可见字符、全角符号和大小写。多行更新同一个商品是允许还是冲突,取决于导入行为和列结构;可配置商品关联、媒体行和多商店行也会故意重复 SKU,因此不能简单删除所有重复行。

数据库侧用精确 SKU 查询实体,并核对目标网站、分类、属性选项关联。升级失败或第三方导入中断可能留下孤立关系,下一次导入才触发唯一索引。发现脏数据时先备份并确认业务含义,不要使用 INSERT IGNORE 或删除唯一索引绕过约束。

URL Key 重复不总是同一种错误

商品 URL Key 冲突常表现为 URL rewrite 保存异常,而不是 SKU 唯一键。多商店下同一个 URL Key 是否冲突取决于 store、request_path 和 redirect 记录。可查询冲突路径:

SELECT url_rewrite_id, entity_type, entity_id, request_path,
       target_path, store_id, redirect_type
FROM url_rewrite
WHERE request_path = 'sample-product.html';

删除 rewrite 前要确认它不是有效的历史重定向。更稳妥的方式是修正商品 URL Key,再让 Magento 的 URL Rewrite 服务重新生成。

属性选项也会制造“看不见的重复”

导入脚本如果每次都创建颜色或品牌选项,却没有按属性与 store label 查询已有 option,就会插入重复业务值。数据库 ID 不同不代表前台含义不同。自定义导入器应使用属性选项管理接口,明确默认标签和商店标签,不能在循环里直接写 EAV 表。

能否继续导入取决于导入行为

Append/Add、Replace 和 Delete 对已有商品的处理不同。正式执行前先使用 Check Data,确认错误数量和允许跳过策略。大批量导入建议按稳定边界拆分,例如按商品类型或 SKU 范围,而不是随机切割可配置父子商品。

处理后用一小份包含简单商品、可配置父子、分类、网站和图片的样本重新导入。核对导入历史、商品数量、网站归属、URL 和索引状态,再继续全量数据。目标不是让 SQL 不再报错,而是保证重复关系没有被静默忽略。