You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Magento 2.1.8升级至2.2.2执行setup:upgrade时主键重复错误求助

Magento 2.1.8升级到2.2.2后setup:upgrade主键重复问题解决方案

我之前帮好几个同行处理过这个Magento升级的坑,不用清空整个salesrule表也能解决,下面给你几个可行的生产环境友好方案:

方案一:临时调整表结构跳过重复插入(最快捷)

这个方法的思路是先移除主键约束,让升级脚本能顺利执行,之后再恢复主键:

  • 登录到你的数据库(可以用命令行mysql -u 你的用户名 -p或者phpMyAdmin)
  • 执行SQL移除salesrule_product_attribute表的主键:
    ALTER TABLE `salesrule_product_attribute` DROP PRIMARY KEY;
    
  • 回到Magento项目根目录,执行升级命令:
    php bin/magento setup:upgrade
    
  • 升级完成后,重新添加复合主键:
    ALTER TABLE `salesrule_product_attribute` ADD PRIMARY KEY (`rule_id`, `product_id`, `attribute_id`, `customer_group_id`);
    
  • 最后清理缓存确保生效:
    php bin/magento cache:clean
    

方案二:手动清理重复的默认记录(更稳妥)

如果不想动表结构,可以先定位并删除导致冲突的那条记录:

  • 先查询表中是否存在触发错误的重复记录:
    SELECT * FROM `salesrule_product_attribute` WHERE rule_id = 0 AND product_id = 0 AND attribute_id = 0 AND customer_group_id = 0;
    
  • 如果查询到结果,执行删除操作:
    DELETE FROM `salesrule_product_attribute` WHERE rule_id = 0 AND product_id = 0 AND attribute_id = 0 AND customer_group_id = 0;
    
  • 接着执行Magento升级命令:
    php bin/magento setup:upgrade
    
  • 完成后清理缓存即可。

为什么会出现这个问题?

Magento 2.2.x的升级脚本里,有一段逻辑会尝试向salesrule_product_attribute表插入一条空值记录,而这个表的主键是rule_id+product_id+attribute_id+customer_group_id的复合键,空值插入时这四个字段都会默认填充0。如果你的数据库里已经存在这条0-0-0-0的记录(可能是之前的操作残留),就会触发主键重复的约束错误。

生产环境必看提醒

不管用哪个方案,操作数据库前一定要先备份!可以用这个命令快速备份:

mysqldump -u 你的用户名 -p 你的数据库名 > magento_backup_$(date +%Y%m%d).sql

避免操作失误导致数据丢失。

内容的提问来源于stack exchange,提问作者bpoiss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:37:47